首页 > 移动平台 > 详细

IOS 关于NSString类型的属性为什么有时用copy,有时用strong呢?

时间:2016-05-29 16:34:18      阅读:582      评论:0      收藏:0      [点我收藏+]

  对于很多初学者,发现在修饰NSString类型的对象时,会有这样的疑惑?怎么有些人用strong修饰,而有些人用copy修饰呢?

  这里有个例子,一.首先声明2个属性:

@property (nonatomic,copy) NSString *CopyName;

@property (nonatomic,strong) NSString * StrongName;

  1.1.创建一个可变字符串,方面后面作变化更改。

 NSMutableString*  MutableName = [NSMutableString stringWithFormat:@"abc"];

  1.2.把MutableName赋值给属性

self.CopyName =MutableName;
self.StrongName = MutableName;

  1.3.把结果打印下:

 NSLog(@"变化前.Copyname=%@\nStrongname=%@",self.CopyName,self.StrongName);
NSLog(@"%p,%p,%p",MutableName,self.CopyName,self.StrongName);

  打印结果如下:

变化前.Copyname=abc    Strongname=abc
0x7fdc32d346a0,0xa000000006362613,0x7fdc32d346a0

发现用copy修饰其实是个深拷贝,拷贝了一块新的空间,里面存了相同的内容。

  1.4.更改MutableName的值,再打印结果

[MutableName appendString:@"def"];
    NSLog(@"变化后.Copyname=%@\nStrongname=%@",self.CopyName,self.StrongName);

  结果如下:

变化后.Copyname=abc    Strongname=abcdef

  这个结果也就不难解释了。strong修饰的StrongName和MutableName指向的是同一块空间,当更改MutableName指向的内容时,StrongName获取的值当然也会改变了。而copy修饰的CopyName指向的是另一块空间,更改MutableName指向的内容时,对它没有影响。

   2.1创建一个不可变的字符串,并赋值给2个属性

   NSString *name =@"abc";
    self.CopyName =name;
    self.StrongName = name;

  2.2打印结果

   NSLog(@"变化前.Copyname=%@\nStrongname=%@",self.CopyName,self.StrongName);
    NSLog(@"%p,%p,%p",name,self.CopyName,self.StrongName);

  结果如下:

变化前.Copyname=abc    Strongname=abc

   0x10695e0f0,0x10695e0f0,0x10695e0f0

  发现这次的结果跟上一次有点不一样了,这次的copy实际上是浅拷贝,只是拷贝了地址,并没有开辟新的空间。

  所以在属性指向不可变的String类型的对象时,用copy和strong修饰没有什么区别。

  而在属性指向可变的MutableString类型时,你期望属性随MutableString的值变化而变化的时候就用strong,反之用copy。数组,字典同理。其实这就涉及到了数据的安全性问题。

  

IOS 关于NSString类型的属性为什么有时用copy,有时用strong呢?

原文:http://www.cnblogs.com/fangwenkai/p/5539626.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!