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。数组,字典同理。其实这就涉及到了数据的安全性问题。

  

时间: 2024-07-31 13:40:32

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

iOS之NSString类型为什么要用copy修饰

在开发的过程中,只知道NSString类型最好用copy修饰而不能用strong,但是不知道为什么,今天了解了下,总算搞明白了. 如下所示,当修饰符为copy时,因为NSMutableString是NSString类型的子类,所以可以用指针self.name指向mStr,但是我们知道copy的含义是指当重新赋值时深拷贝新对象再赋值给self.name, 所以此时self.name的指针和mStr的指针指向的对象就不同了,所以当给mStr对象发送方法appendString的时候,修改的只是mSt

Objc中为何某些类的属性要设置为copy而不是strong?

大熊猫猪·侯佩原创或翻译作品.欢迎转载,转载请注明出处. 如果觉得写的不好请多提意见,如果觉得不错请多多支持点赞.谢谢! hopy ;) 不知道大家是否注意,我们再使用一些第三方类的时候大多数情况下对象属性的type都是strong,但是某些类却设置成了copy类型,这是为什么? 看似很细小的改变其实是有其用意的. copy和strong之间的区别很清楚,前者只是直接引用一个对象,而后者却是引用一个对象的拷贝. 比如如下示例: #import <UIKit/UIKit.h> @interfac

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

转自:http://www.cocoachina.com/ios/20150512/11805.html. 我们在声明一个NSString属性时,对于其内存相关特性,通常有两种选择(基于ARC环境):strong与copy.那这两者有什么区别呢?什么时候该用strong,什么时候该用copy呢?让我们先来看个例子. 示例 我们定义一个类,并为其声明两个字符串属性,如下所示: 1 2 3 4 @interface TestStringClass () @property (nonatomic, s

iOS中block类型大全

iOS中block类型大全 typedef的block 作为属性的block 作为变量的block 作为方法变量入参的block 作为方法参数的block 无名block 内联函数的block 递归调用的block 作为方法返回值的block 作为函数名的block(太过奇葩,完全不知道怎么用-_-!) iOS中block类型大全,码迷,mamicode.com

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

我们在声明一个NSString属性时,对于其内存相关特性,通常有两种选择(基于ARC环境):strong与copy.那这两者有什么区别呢?什么时候该用strong,什么时候该用copy呢?让我们先来看个例子.        示例 我们定义一个类,并为其声明两个字符串属性,如下所示: 1 2 3 4 @interface TestStringClass () @property (nonatomic, strong) NSString *strongString; @property (nonat

NSString属性声明中的copy和retain区别

规范上NSString做属性都是写成copy的,理论上应该是复制了字符串而不是单纯的增加引用计数,其实问题只会出现在把NSMutableString赋值给NSString的时候. 首先做以下几个变量声明: @property (retain, nonatomic) NSString *retainStr; @property (copy, nonatomic)   NSString *copyStr; @property (retain, nonatomic) NSMutableString *

iOS的NSString什么情况用strong,什么时候用copy?

我们在声明一个NSString属性时,对于其内存相关特性,通常有两种选择(基于ARC环境):strong与copy.那这两者有什么区别呢?什么时候该用strong,什么时候该用copy呢?让我们先来看个例子. 示例 我们定义一个类,并为其声明两个字符串属性,如下所示: 1 2 3 4 @interface TestStringClass () @property (nonatomic, strong) NSString *strongString; @property (nonatomic, c

文顶顶 iOS开发UI篇—transframe属性(形变)

iOS开发UI篇—transframe属性(形变) 1. transform属性 在OC中,通过transform属性可以修改对象的平移.缩放比例和旋转角度 常用的创建transform结构体方法分两大类 (1) 创建“基于控件初始位置”的形变 CGAffineTransformMakeTranslation(平移) CGAffineTransformMakeScale(缩放) CGAffineTransformMakeRotation(旋转) (2) 创建“基于transform参数”的形变

iOS开发UI基础—transframe属性(形变)

iOS开发UI基础-transframe属性(形变) 1. transform属性 在OC中,通过transform属性可以修改对象的平移.缩放比例和旋转角度 常用的创建transform结构体方法分两大类 (1) 创建"基于控件初始位置"的形变 CGAffineTransformMakeTranslation(平移) CGAffineTransformMakeScale(缩放) CGAffineTransformMakeRotation(旋转) (2) 创建"基于trans