strong和copy是常用到的修饰符,那么什么时候用strong,什么时候用copy,先上一段代码再说(以下代码直接在ViewController中写);
先定义两个数组
///strong @property (nonatomic,strong) NSArray *arraystrong; ///copy @property (nonatomic,copy) NSArray *arraycopy;
viewDidLoad方法
- (void)viewDidLoad { [super viewDidLoad]; NSMutableArray *arrayMut = [NSMutableArray array]; ///先添加一个字符串 [arrayMut addObject:@"xiaogui1"]; self.arraystrong = arrayMut; self.arraycopy = arrayMut; ///再添加一个字符串 [arrayMut addObject:@"xiaogui2"]; ///内容 NSLog(@"arraystrong=%@ arraycopy%@ ",self.arraystrong,self.arraycopy); ///地址 NSLog(@" 内存地址: arrayMut 地址:%p arraystrong 地址:%p arraycopy 地址:%p ",arrayMut,self.arraystrong,self.arraycopy); }
打印结果
再来看下三个数组指向的内存地址:
可以看到arraystrong随着arrayMut的改变而改变了,而arraycopy没有随着arrayMut的改变而改变;原因是因为用strong来修饰时,赋值时并没有创建新的空间,由打印的地址可以看到指向的是同一个指针的内存空间,而用copy时,创建了新的内存空间,没有和arrayMut指向同一个地址; 但是还有一个问题,往 ↓ 看:
当我把self改成下划线_去引用变量时:
- (void)viewDidLoad { [super viewDidLoad]; NSMutableArray *arrayMut = [NSMutableArray array]; ///先添加一个字符串 [arrayMut addObject:@"xiaogui1"]; ///把self改成_ _arraystrong = arrayMut; _arraycopy = arrayMut; ///再添加一个字符串 [arrayMut addObject:@"xiaogui2"]; NSLog(@"arraystrong=%@ arraycopy%@",self.arraystrong,self.arraycopy); }
打印结果:
这是因为用self引用时,调用了自身的get set方法,也就是因为这样,才实现了strong和copy的不同,而直接用_是没有执行get set 方法的,所以两个数组的值是一样的;所以一般在项目中,全部使用self比较好,个人认为,有误还请指出。