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比较好,个人认为,有误还请指出。

  • 相关阅读:
    C#事务相关
    建造者模式
    CUPS/Printer sharing
    vim note write
    linux下神奇的script
    Nginx server之Nginx添加ssl支持
    nginx使用ssl模块配置HTTPS支持
    stardict dict url
    收银台(POSBox) 配置向导
    让 Odoo POS 支持廉价小票打印机
  • 原文地址:https://www.cnblogs.com/wangkejia/p/7867264.html
Copyright © 2011-2022 走看看