写一个@property编译器自动
1)生成私有属性,(属性类型和@property属性一致,属性名前自动加一个下划线“_”)
2)生成getter setter的声明
3)生成getter setter的实现
继承:
父类的@property可以被子类继承,@property生成的属性是私有的,在子类中无法直接访问,可以通过getter setter来访问
@property参数
1)与多线程相关的 : atomic 、 nonatomic
2) 与生成setter方法的实现相关的: assign、retain(MRC)、copy
3)与生成只读、读写相关的:readonly 、readwrite
4)与生成getter、 setter方法名相关的: getter 、setter
5)与强弱指针类型有关的:strong 、 weak
区别:
atomic 、 nonatomic:
atomic默认值,生成setter方法的代码会被加上一把线程安全锁,安全、效率低下;
nonatomic在生成setter方法的代码不会加线程安全锁,不安全、效率高;
assign、retain(MRC)、copy :
assign:用于基本数据类型、非OC对象,setter方法直接赋值,不更改引用计数
retain:setter方法实现是标准的MRC内存管理代码,先判断新旧对象是否是同一个对象,如果不是,release旧的retain新的对象,引用计数+1
-(void)setCar:(int)car{
if(_car ! = car)
{ [_car release];
_car = [car retain];
}
}
注意:retain参数只是生成的标准的setter方法,不会自动的在dealloc中生成release的代码,所以要手动的重写dealloc方法,生成release的代码
copy: 拷贝特性,setter方法将release旧值,copy新值,传入的对象是在内存中拷贝一份,两个指针指向不同的内存地址。
retain和copy的区别就是:copy其实是建立了一个相同的对象,引用计数为1,而retain只是保存其对象,并且其计数值+1。retain是指针拷贝,copy是内容拷贝。
readonly 、readwrite
readonly: 只生成getter方法,不会生成setter方法
readwrite:默认值,同时生成getter、setter
getter 、setter
通过getter=方法名、setter=方法名修改@property生成的getter 、setter方法的名字