OC 中 strong, weak, assign, copy 的区别

strong

强引用,只可以修饰对象,属性的默认修饰符,其修饰的对象引用计数增加1

weak

弱引用,只可以修饰对象,指向但不拥有对象,其修饰的对象引用计数不增加,可以避免循环引用,weak修饰的对象释放后,指针会被系统置为nil,此时向对象发送消息不会奔溃

assign

可以修饰对象和基本数据类型,如果修饰对象,其修饰的对象引用计数不增加,可以避免循环引用,但assign修饰的对象释放后,指针不会被系统置为nil,这会产生野指针的问题,此时向对象发送消息会奔溃。所以assign通常用于基本数据类型,如int ,float, NSInteger, CGFloat ,这是因为基本数据类型放在栈区,先进先出,基本数据类型出栈后,assign修饰的变量就不存在了,不用担心指针的问题。

copy

引用,修饰不可变的对象,比如NSString, NSArray, NSDictionary。copy和strong类似,不同之处在于,copy修饰的对象会先在内存中拷贝一个新的对象,copy会指向那个新的对象的内存地址,这样避免了多个指针指向同一对象,而导致的其中一个指针改变了对象,其他指针指向的对象跟着改变,举个例子:

@property(strong) NSString *name1;
@property(copy) NSString *name2;

NSMutableString *name3 = [NSMutableString stringWithString:@"Danny"];
self.name1 = name3;
self.name2 = name3;
[name3 setString:@"Liming"];
NSLog(@"%@", self.name1);  // Liming
NSLog(@"%@", self.name2);  // Danny

我们可以看到使用strong的属性name1会跟着name3变,因为他们都指向同一个NSMutableString的对象,而name2预先拷贝了name1,从而避免了和name1一起变化。

copy的原则就是,把一个对象赋值给一个属性变量,当这个对象变化了,如果希望属性变量变化就使用strong属性,如果希望属性变量不跟着变化,就是用copy属性。

你可能感兴趣的:(OC 中 strong, weak, assign, copy 的区别)