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

Posted steer

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了IOS 关于NSString类型的属性为什么有时用copy,有时用strong呢?相关的知识,希望对你有一定的参考价值。

  对于很多初学者,发现在修饰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 [email protected]"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呢?的主要内容,如果未能解决你的问题,请参考以下文章

ARC 下的 NSString 属性应该是强的还是复制的?

ios appendstring怎么用

如何在 iOS 7 中执行动态/计算属性

iOS 关于NSString的一些方法

NSString属性什么时候用copy,什么时候用strong?

NSString属性什么时候用copy,什么时候用strong?