@property
在xcode4.4以前,编译器只要看到@property,就知道我们要生成某一个属性的getter/setter方法的声明
在4.4以后对@property进行增强,以后只要利用一个@property就可以同时生成setter/getter方法声明和实现,不必写@synthesize
没有告诉@property要传入的参数赋值给谁,默认@property会将传入的值赋给有下划线开头的那个成员变量
如果使用@property来生成setter/getter方法,可以不写成员变量,系统会自动生成一个_开头的成员变量,但是生成的成员变量是一个私有的成员变量,相当于在.m文件中生成的
弊端:他只会生成最简单的getter/setter方法和声明,并不会对传入的值进行过滤
需要对数据进行过滤,就必须对setter/getter进行重写
如果重写了setter方法,那么就只生成getter方法
如果重写了getter方法,那么就只生成setter方法
如果同时重写了getter/setter方法,那么就不会自动帮我们生成私有的成员变量
@property NSString *info;
- (void)setInfo:(NSString *)info;
- (NSString *)info;
和
- (void)setInfo:(NSString *)info
{
_info = info;
}
- (NSString *)info
{
return info;
}
作用一致,不过在定义成员变量时,成员变量一定要在前方加下划线,而使用@property时要删除下划线
@property修饰符
格式:@property(属性修饰符) type name;
- readonly:代表只生成getter方法不生成setter方法
- readwrite:代表既生成getter方法,又生成setter方法
修改getter和setter方法名字
@property(getter = funName) NSString * info;
@property(setter = funName) NSString * info;
一般BOOL类型属性的值,将获取的方法名称改为isXXXX,便于阅读
retain和assign
-
retain:自动帮我们生成getter/getter方法内存管理代码
-
assign:不会帮我们生成set方法内存管理的代码,仅仅只会生成普通 的getter/getter方法,默认什么都不写就是assign
使用retain会生成以下代码
- (void)setClassName:(ClassName *)classname
{
//判断传入的对象和当前对象是否一样
if(_classname != classname)
{
//release以前的对象
[_classname release];
//retain传入的对象
_classname = [classname retain];
}
}
但凡使用了retain一定要用release
//装逼的release
//在重写dealloc中
//self. 相当于调用了retain中的set方法
self.name = nil;
//等价于
[_name release];
_name = nil;
多线程atomic和nonatomic
- atomic:性能低(默认)
- nonatomic:性能高,在iOS开发中99.9%使用nonatomic
@property(nonatomic, retain) type name;
//在ARC中使用strong代替retain
@property(nonatomic, strong) type name;
注意:
-
相同类型的property修饰符不能同时使用
readonly和readwrite,retain和assign不能同时使用
-
不同类型的property修饰符可以多个结合在一起使用,多个之间用逗号隔开
-
iOS开发中只要写上property,那么就立刻写上nonatomic
@synthesize
@synthesize 是一个编译器指令,他可以简化getter/setter方法的实现
- 在@synthesize后面告诉编译器,需要实现哪个@property生成的声明
- 告诉@synthesize,需要将传入的值赋给谁和返回谁的值给调用者
- 如果在@synthesize后面没有告诉系统将值赋给谁,系统会默认将值赋给和@synthesize后面写的名称一致的成员变量,也就是会把值给info而不是_info
@synthesize info = _info;
网友评论