NSArray和NSString copy属性问题

什么时候加copy

在定义属性的时候,如果属性的数据类型有对应的Mutable类型,那么该非Mutable类型属性要指定为为copy。比如:NSString/NSMutableString、NSArray/NSMutableArray、NSDictionary/NSMutableDictionary、NSSet/NSMutableSet。如下图:


测试例子

下面示例说明:

  • 在mutable类型再给对应非mutable类型赋值的时候,对应有mutable的类型一般都需要在属性里面指定copy,否则非mutable类型的数据是不稳定的。

  • 非mutable类型指定为copy后,copy的只是MutableArray的数组索引,里面的数据元素依然和MutableArray中的对象元素地址是一样的。

  • 下面例子对NSArray做实验,也适用于NSString。

 

@interface  QRATestViewController ()
 
@property  (nonatomic, copy) NSArray *testCopyArray;
@property  (nonatomic, strong) NSArray *testStrongArray;
// 带mutable的类型定义属性不能加copy
@property  (nonatomic, copy) NSMutableArray *testMutableArray;
 
@end
 
- (IBAction)testTouchUp:(id)sender {
     // 在这里可以做一些简单的测试工作
     NSMutableArray *mutableArray = [[NSMutableArray alloc] init];
     [mutableArray addObject:@ "111" ];
     
     self.testCopyArray = mutableArray;
     self.testStrongArray = mutableArray;
     
     [mutableArray addObject:@ "2222" ];
     
     // testCopyArray中的元素不包含2222,但是testStrongArray中的数组元素中包含2222
     // 表示mutableArray数组元素的变化不会影响到testCopyArray
     NSLog(@ "%@  %@" , self.testCopyArray, self.testStrongArray);
     
     // 输出的对象地址是一样的,表示testCopyArray中的元素依然是原先对象
     NSLog(@ "%p  %p" , self.testCopyArray[ 0 ], mutableArray[ 0 ]);
     
     // 因为testMutableArray带了copy,所以这里默认是copy不是mutableCopy,导致下面一行crash
     self.testMutableArray = mutableArray;
     [self.testMutableArray addObject:@ "333" ];
     
     NSLog(@ "%@" , self.testMutableArray);
}

参考链接

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值