随笔
-
如果向一个 NSMutableArray 中添加一个弱引用类型的对象,会有什么情况?
-
如果该弱引用是用 weak 修饰的,那么,如果在添加时,其所指向的对象已经没有其他强引用指向它,那么,程序会崩溃,因为变量已经被置为 nil ,如下,同样使用
__weak
修饰,添加 NSString 和 NSMutableString 类型到数组中时,前者成功,而后者失败。self.list = [NSMutableArray array]; __weak NSString *str1 = @"test"; [self.list addObject:str1]; __weak NSMutableString *str2 = [[NSMutableString alloc]initWithString:@"test"]; [self.list addObject:str2];
-
如果该弱引用是用 assign 修饰的,那么,如果在添加时,其所指向的对象已经没有其他强引用指向它,那么,程序会崩溃,也可能不会崩溃,因为 assign 修饰的变量不会被自动置为 nil ,此时指向的对象可能还在,也可能被收回或分配给其他对象了。
-
当弱引用对象成功添加到数组中后,其弱引用变量被置为 nil 也不会影响数组对该对象的强引用。
-
-
向一个 copy 修饰的属性赋值,其类型与其声明的一致么?
未必一致,其变量类型由赋值时的变量实现的
NSCopying
协议中的copyWithZone
方法决定,如为如下属性赋值时:@property (nonatomic, copy) NSString *str; NSString *test = [[NSMutableString alloc]initWithString:@"test"]; self.str = test;
其实际的类型为
NSTaggedPointerString
,是NSString
的子类。甚至,你可以使用实现了NSCopying
协议的自定义类对象为其赋值,而在copyWithZone
方法中返回一个NSData
类型的实例对象。需要注意的是,如果直接给属性 str 对应的成员变量 _str 赋值,copy 修饰符是不生效的,实际就是 NSCopying 协议中的方法并不会被执行。