1、nonatomic 和 atomic (默认)
修饰实例变量,使其线程中是否安全,或者高效
atomic用于多线程中,是原子性的(即它的方法有加锁和解锁的过程)
nonatomic用于单线程,非原子性,因为没有加锁和解锁的过程所以效率比atomic的高但是其安全隐患大
2、assign(默认,MRC、ARC都有)
用于CGFloat、NSInteger、基本数据类型(c类型)
用于不保留变量的对象、即相当创建弱引用从而避免循环引用的发生
- (void) (assign) setter:(type *)XXXX
{
_xxxx = XXXX; /* 相当直接赋值,引用计数器不回加1 */
}
3、strong(默认) 和 weak (仅ARC中有)
strong表示强引用关系,拥有对象的所有权(拥有对象的所有权即意味着要对其拥有的对象进行释放),引用计数器会加一
- (void) (strong) setter:(type *)XXXX
{
[XXXX retain]; //新值引用计数加一保留
[_xxxx release]; //旧值引用计数减一释放
_xxxx = XXXX;
}
weak表示弱引用关系,不拥有对象的所有权,目标对象销毁之后,属性会设置为nil
- (void) (weak) setter:(type *)XXXX
{
_xxxx = XXXX; /* 相当直接赋值,引用计数器不回加1 */
}
//当[XXXX release] , _xxxx == nil
4、copy(ARC、MRC都有)
copy引用计数加一,操作一个内存,注意在源对象可变(浅拷贝)不可变(深拷贝)时候的问题
- (void) (copy) setter:(type *)XXXX
{
[XXXX retain]; //新值引用计数加一保留
[_xxxx release]; //旧值引用计数减一释放
_xxxx = [XXXX copy]; //返回一个不可变的类型
}
5、retain
retain为当前对象指向的对象 引用计数+1保证不被释放
6、readwrite (默认) 和 readonly
用于限制是否能用点方法(setter方法)外部修改实例变量 (可以通过内部修改)
@interface xxxx
//这里属性会自动生成实例变量_name
@property (readwrite) NSString *name;
//readwrite会生成setter、getter方法
@end
在setter方法中_name = name(为NSString *的指针),调用点方法(setter方法)时从内存理解如下:
在getter方法中,为return _name;
@interface xxxx
//这里属性会自动生成实例变量_name
@property (readnoly) NSString *name; //readonly只生成getter方法
@end
因为没有setter方法,所以没有_name = name ,所以不能用点方法来改变,但是依旧可以用其它的方式改变_name;