zoukankan      html  css  js  c++  java
  • 再谈 retain,copy,mutableCopy(官方SDK,声明NSString都用copy非retain)

    之前一直以为retain就是简单的计数器+1,copy就是重新开辟内存复制对象;

    其实不是这样,原来之前的自己独自徘徊于糊涂之中。
    (官方SDK,对NSString属性的定义都是用copy,而不是retain)
    在明了的原因是,怕你赋值的是一个MutableString,而MutableString是可变了,如果只是retain,那么当你在外面改变了这个值的时候,你的属性的值也改变了

    代码:
    定义一个属性:
    @property (copy,nonatomic)NSString *myTest;
    @synthesize myTest;


        NSMutableString *temp = [[NSMutableStringalloc]initWithFormat:@"jjjjjj"];
        self.myTest = temp;
        NSLog(@"%@   ",myTest);
         [temp appendString:@"adsdsdsd"];
         NSLog(@"%@   ",myTest);


    打印:
    2013-02-20 11:45:41.129 Nimbus[2474:c07] jjjjjj   

    2013-02-20 11:45:41.131 Nimbus[2474:c07] jjjjjj   



    那如果用retian呢??
    @property (retain,nonatomic)NSString *myTest;
    @synthesize myTest;

        NSMutableString *temp = [[NSMutableStringalloc]initWithFormat:@"jjjjjj"];
        self.myTest = temp;
        NSLog(@"%@   ",myTest);
         [temp appendString:@"adsdsdsd"];
         NSLog(@"%@   ",myTest);


    2013-02-20 11:48:46.794 Nimbus[2791:c07] jjjjjj   
    2013-02-20 11:48:46.795 Nimbus[2791:c07] jjjjjjadsdsdsd   




    声明的一个NSString *str变量,然后把一个NSMutableString *mStr变量的赋值给它了,如果要求str跟着mStr变化,那么就用retain;如果str不能跟着mStr一起变化,那就用copy。而对于要把NSString类型的字符串赋值给str,那两都没啥区别。不会影响安全性,内存管理也一样。


    mutableCopy:始终是深复制,引用计数不改变。始终返回一个可变对象

  • 相关阅读:
    python3 TypeError: a bytes-like object is required, not 'str'
    Centos 安装Python Scrapy PhantomJS
    Linux alias
    Vim vimrc配置
    Windows下 Python Selenium PhantomJS 抓取网页并截图
    Linux sort
    Linux RSync 搭建
    SSH隧道 访问内网机
    笔记《鸟哥的Linux私房菜》7 Linux档案与目录管理
    Tornado 错误 "Global name 'memoryview' is not defined"
  • 原文地址:https://www.cnblogs.com/james1207/p/3358006.html
Copyright © 2011-2022 走看看