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

  • 相关阅读:
    Oracle OCP提纲
    Oracle redo 日志损坏的几种情况下的恢复
    Oracle 归档开启切换和归档日志删除(单实例和RAC)
    MySQL mysqldump备份与恢复
    Oracle 卸载
    MySQL脚本自动安装mysql-5.6.15-linux-glibc2.5-x86_64.tar.gz
    Oracle session出现大量的inactive
    Oracle 备份与恢复基础
    NuGet 下载dll
    Azure Service Bus
  • 原文地址:https://www.cnblogs.com/wangkejia/p/7867264.html
Copyright © 2020-2023  润新知