黑马程序员--Objective-C之[email protected]和@synthesize关键字

property是Objective-C的关键词,与@synthesize配对使用,用来让编译好器自动生成与数据成员同名的方法声明。@synthesize则是用来生成对应声明方法的实现。

一、@property关键字

1、property的语法格式:

@property (参数1,参数2)类型名字;

这里的参数,主要有以下三种:

(1)setter/getter方法(assign/retain/copy)

(2)读写属性(readwrite/readonly)

(3)atomicity(nonatomic)

2、三种方式的使用

(1)assign/retain/copy  代表赋值的方式

(2)readonly关键字代表setter不会被生成, 所以它不可以和 copy/retain/assign组合使用。

(3)atomicity的默认值是atomic,读取函数为原子操作。

copy/reain/assign 在其中选择一个来确定属性的setter如何处理这个属性。NSObject对象采用这个中方式。

一些特别的Object比如NSSstring使用copy。

assign关键字代表setter直接赋值,而不是复制或者保留它。适用于基本数据类型,比如NSInteger和CGFloat,或者你并不直接拥有的类型,比如delegates。

3、如何使用@property

/*没有使用@property的情况定义成员变量*/

#import <UIKit/UIKit.h>  

@interface ViewController : UIViewController
{
    NSObject *_obj;
} 
- (void)viewDidLoad;
@end 
@implementation ViewController
- (void)viewDidLoad
{
    [super viewDidLoad];
    self.obj = nil;、
} 
@end 

此时编译器会报错。

/*使用@property的情况定义成员变量*/

#import <UIKit/UIKit.h>  

@interface ViewController : UIViewController
{
    NSObject *_obj;
}
@property (nonatomic,retain) NSObject *obj;
@end 

编译能通过,运行,崩溃,提示错误 reason: ‘-[ViewController setObj:]: unrecognized selector sent to instance 0x6b6c480

那就是我们没事实现setter方法。

用@synthesize关键字实现getter 和setter。

    @implementation ViewController
    @synthesize obj;
    - (void)viewDidLoad
    {
        [super viewDidLoad];
        self.obj = nil;
    }  

运行,程序运行正常。说明setter 起作用了。

4、@property和@synthesize关键字 生成的代码

#import <UIKit/UIKit.h>  

@interface ViewController : UIViewController
{
    NSObject *obj;
}
//@property (nonatomic,retain) NSObject *obj;
-(NSObject*)obj;
-(void)setObj:(NSObject*)newObj;
@end 
    @implementation ViewController
    //@synthesize obj;
    - (void)viewDidLoad
    {
        [super viewDidLoad];
        self.obj = nil;
    }  

    -(NSObject*)obj{
        return obj;
    }
    -(void)setObj:(NSObject*)newObj{
        if(obj != newObj){
            [obj release];
            obj = [newObj retain];
        }
    }  

再运行,也能正常启动。说明自己写的getter 和setter替代了property。

5、使用三种参数的对比

@property (nonatomic,retain)NSObject *obj;

@property (nonatomic,retain,readwrite) NSObject *obj;

readwrite是默认行为,所以这两行代码等价

@property (retain) NSObject *obj;

@property (atomic,retain) NSObject *obj;

atomic是默认行为,所以这两行代码是等价的。

@property(atomic,assign)int number;        

@property(atomic) int number;        

@property int number;

对int 来说,atomic assign都是默认行为,所以这三行是等价的。

@property  NSObject *obj;

这样写行吗?不行的,报警告

只有int 等基础数据类型能这么写。对象必须加上赋值的类型。

@property  (retain) NSObject *obj;

这样就没问题了。何时使用assign、何时使用retain、copy后面再讲。

二、@synthesize关键字

//
//  Person.m
//  25_Property
//
//  Created by jiangwei on 14-10-12.
//  Copyright (c) 2014年 jiangwei. All rights reserved.
//

#import <Foundation/Foundation.h>
#import "User.h"

//有时候我们不想定义属性为_开头的
//这时候我们就可以使用@synthesize,来修改我们想要的属性名

//这时候属性_userName变成了$userName

@implementation User
@synthesize userName = $userName;

@end

因为我们使用@property定义属性之后,如果我们想修改这个属性的名称,就可以使用@synthesize关键字来对属性名称进行修改

@synthesize userName = $userName;
时间: 2024-07-30 13:50:36

黑马程序员--Objective-C之[email protected]和@synthesize关键字的相关文章

黑马程序员_OC学习笔记之@property和@synthesize

[objc] view plaincopyprint? <span style="font-size:24px;">#import <Foundation/Foundation.h> @interface Person : NSObject { int _age; int age; int _height; int height; int _weight; int weight; int _money; int money; } @property int ag

黑马程序员_Objective C中的@property 与 @synthesize 快速生成setter getter方法

<a href="http://www.itheima.com"target="blank">ASP.Net+Unity开发</a>.<a href="http://www.itheima.com"target="blank">.Net培训</a>.期待与您交流! 一般来说在一个类中 成员变量是会有setter 跟getter方法的. 如果每一个成员变量的setter 跟gett

黑马程序员[email&#160;protected]和@synsthesize的使用

一.@property和@synthesize的基本使用 @property :可以自动生成某个成员变量的setter和getter的声明(@property int age;).写在@interface里面: @synthesize :自动生成age的setter和getter,并且在方法内部访问的是_age这个成员变量(@synthesize age = _age; // 如果后面不写=_age默认就是访问age成员变量).写在@implementation里面: 二.@property和@

黑马程序员_API

------- android培训.java培训.期待与您交流! ---------- ======================API========================================= 看api的步骤: 1.看类的说明.其所属的包以及出现的版本. 2.看其构造函数. 3.看普通的方法.看时注意参数,和返回值类型. Object类 1. private static native void registerNatives (); 见到本地关键字修饰的方法,这个方

黑马程序员-面向对象-Object类

---------------------- <a href="http://edu.csdn.net"target="blank">ASP.Net+Unity开发</a>.<a href="http://edu.csdn.net"target="blank">.Net培训</a>.期待与您交流! ---------------------- 一.Object类中的equals(

黑马程序员_OC学习笔记之Foundation框架集合类

OC--集合类 1.OC集合类包括NSArray,NSSet,NSDictionary都是以面向对象的方式操作数组,而且OC数组不像C语言中的数组只能存放同一种数据类型,它可以存放任意类型的对象,但是不能存放非OC对象类型如基本数据类型int,struct,enum等 2.OC数组是以对象的方式存在,因此在创建的时候需要为创建的对象前面加* 3.NSArray数组一旦创建就决定了是不是可变,而且永远是可变或不可变 4.NSArray数组和子类NSMutableArray的基本操作: 1>使用NS

黑马程序员——oc语言学习心得—— 属性声明和赋值

黑马程序员——oc语言学习心得—— 属性声明和赋值 -------Java培训.Android培训.iOS培训..Net培训.期待与您交流! ------- 1,在oc中所有类继承与终极父类Object2,声明字符变量采用N是string  *_xxx 实例变量一般以下划线开头3,在oc中方法以+ -号区分 -号开头是实例方法或对象方法  +号开头是类方法  前置用对象调用 后者用类名调用4,在xcode4以后声明@property 不用在写@snysize  自动生成get.set方法5,属性

黑马程序员——java高新---注解、泛型等

------Java培训.Android培训.iOS培训..Net培训.期待与您交流! ------- 一.注解 什么是注解? 答:对于过时的语句,java会提示过时了,通过@SuppressWarnings("Deprecation")可以在DOS命令行中取消提示,但Eclipse无法取消.这就是注解,相当于标记.编译器.开发工具.javac通过反射获得注解里的内容,进而明确应该做什么.不应该做什么.注解可以加在包.类.属性.方法.参数及局部变量之上.一个注解就是一个类. java.

【黑马程序员】第12课:文件上传&文件下载&注解

<pre> day12 上节内容回顾 1.jstl的标签 *if  choose *forEach <c:forEachvar="l" items="${list}"> 2.jsp开发模式 *模型一 *模型二(mvc模式) **mvc模式 ***m:模型,使用javabean ***v:视图,使用jsp ***c:控制器,使用servlet *dao模式:数据访问对象,专注于对数据库的操作 **首先创建接口,在接口里面定义操作数据库的方法 *