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:始终是深复制,引用计数不改变。始终返回一个可变对象

  • 相关阅读:
    一次数据库的整理的sql语句
    网页交互及xml的一些属性对程序的影响
    google编程挑战赛Round1的前两道题
    修改Windows帐户密码,导致Sql Server 2000无法启动。
    在虚拟主机中无法实现缩放等交互
    动态控件创建的一些经验
    文章
    如何解决 SQL Server 2000 中的连接问题
    待看
    I帧,P帧,B帧简介
  • 原文地址:https://www.cnblogs.com/james1207/p/3358006.html
Copyright © 2011-2022 走看看