随笔

随笔

  1. 如果向一个 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 也不会影响数组对该对象的强引用。

  2. 向一个 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 协议中的方法并不会被执行。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值