[ios]@property 属性中 assign,nonatomic,retain,strong,weak的区别

@property 属性中 assign,nonatomic,retain,strong,weak的区别

atomic:默认是有该属性的,这个属性是为了保证程序在多线程情况下,编译器会自动生成一些互斥加锁代码,避免该变量的读写不同步问题。

nonatomic:如果该对象无需考虑多线程的情况,请加入这个属性,这样会让编译器少生成一些互斥加锁代码,可以提高效率。

copy : 建立一个索引计数为1的对象,然后释放旧对象

retain :释放旧的对象,将旧对象的值赋予输入对象,再提高输入对象的索引计数为1

Copy其实是建立了一个相同的对象,而retain不是:

比如一个NSString 对象,地址为0×1111 ,内容为@”STR”

Copy 到另外一个NSString 之后,地址为0×2222 ,内容相同,新的对象retain为1 ,旧有对象没有变化

retain 到另外一个NSString 之后,地址相同(建立一个指针,指针拷贝),内容当然相同,这个对象的retain值+1

也就是说,retain 是指针拷贝,copy 是内容拷贝。

使用assign:  对基础数据类型 (NSInteger,CGFloat)和C数据类型(int, float, double, char, 等等)

使用copy:  对NSString

使用retain: 对其他NSObject和其子类

strong 与weak

strong关键字与retain关似,用了它,引用计数自动+1

代码示例:

@property (nonatomic, strong) NSString *string1;

@property (nonatomic, strong) NSString *string2;

self.string1 = @"String 1";

self.string2 = self.string1;

self.string1 = nil;

NSLog(@"String 2 = %@", self.string2);

输出结果是:String 2 = String 1

由于string2是strong定义的属性,所以引用计数+1,使得它们所指向的值都是@"String 1", 如果你对retain熟悉的话,这理解并不难。

你可能感兴趣的:([ios]@property 属性中 assign,nonatomic,retain,strong,weak的区别)