[ios]@property 属性中 assign,nonato

作者: 许威彬 | 来源:发表于2016-08-24 12:09 被阅读73次

    @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,nonato

        本文链接:https://www.haomeiwen.com/subject/pdtosttx.html