iOS-strong和copy【详细解读】

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=%@\narraycopy%@\n",self.arraystrong,self.arraycopy);
    ///地址
    NSLog(@"\n\n内存地址:\n\narrayMut 地址:%p\narraystrong 地址:%p\narraycopy 地址:%p\n",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=%@\narraycopy%@",self.arraystrong,self.arraycopy);
}

打印结果:

这是因为用self引用时,调用了自身的get set方法,也就是因为这样,才实现了strong和copy的不同,而直接用_是没有执行get set 方法的,所以两个数组的值是一样的;所以一般在项目中,全部使用self比较好,个人认为,有误还请指出。

 

posted @ 2017-11-20 17:16  macroK  阅读(510)  评论(2编辑  收藏  举报