• 博客园logo
  • 会员
  • 众包
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • HarmonyOS
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录
james1207

博客园    首页    新随笔    联系   管理    订阅  订阅

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

posted @ 2013-10-08 21:48  Class Xman  阅读(152)  评论(0)    收藏  举报
刷新页面返回顶部
博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3