码迷,mamicode.com
首页 > 移动开发 > 详细

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

时间:2016-05-29 16:34:25      阅读:329      评论: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
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!