strong,weak和unsafe_unretain都是用来描述属性的存储特性的。
下面通过实例来介绍一下他们的区别:
strong:
@property (nonatomic, strong) NSString* string1;@property (nonatomic, strong) NSString* string2;self.string1 = @"string1";self.string2 = self.string1;self.string1 = nil;NSLog(@"string 2 = %@",self.string2);
显示结果: string 2 = string1;
strong类似于retain
当self.string1= @"string1"时,引用计数+1
当self.string2 = self.string1时,引用计数+1
self.string1 = nil,引用计数-1,但是由于引用计数!=0,所以存放@"string1"的地址并没有释放掉其中的值。
weak:
@property (nonatomic, strong) NSString* string1;@property (nonatomic, weak) NSString* string2;self.string1 = @"string1";self.string2 = self.string1;self.string1 = nil;NSLog(@"string 2 = %@",self.string2);
显示结果:string2 = (null);
self.string1 和self.string2指向同一个地址,当self.string1 = nil时,存放字符串string1的内存被释放掉,由于self.string2是weak,所以它让self.string2指向nil。
unsafe_unretained:
@property (nonatomic, strong) NSString* string1;@property (nonatomic, unsafe_unretained) NSString* string2;self.string1 = @"string1";self.string2 = self.string1;self.string1 = nil;NSLog(@"string 2 = %@",self.string2);
这将导致crash,这正是weak和unsafe_unretained的区别,当释放掉内存后,weak会让它指向nil,但是unsafe_unretained并不会做任何额外的处理,所以self.string2成了野指针。