zoukankan      html  css  js  c++  java
  • 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=%@
    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比较好,个人认为,有误还请指出。

  • 相关阅读:
    使用ParseExact方法将字符串转换为日期格式
    Windows 备用数据流(ADS)的妙用___转载
    ms17_010利用复现(32位)
    将手机号设置为空号
    PowerShell批量创建文件夹
    让程序显示运行时间
    使用Sleep方法延迟时间
    使用TimeSpan对象获取时间间隔
    DateTime小综合
    DDMS介绍
  • 原文地址:https://www.cnblogs.com/wangkejia/p/7867264.html
Copyright © 2011-2022 走看看