@property声明的NSString(或NSArray,NSDictionary)经常使 copy关键字,为什么?如果改用strong关键字,可能造成什么问题?

因为父类指针可以指向子类对象,使用copy的目的是为了让本对象的属性不受外界影响,使用copy无论给我传入是一个可变对象还是不可对象,我本身持有的就是一个不可变的副本.

如果我们使用的是strong ,那么这个属性就有可能指向一个可变对象,如果这个可变对象在外部被修改了,那么会影响该属性.

copy此特质所表达的所属关系与strong类似。然而设置方法并不保留新值,而是将其“拷贝” (copy)。当属性类型为NSString时,经常用此特质来保护其封装性,因为传递给设置方法的新值有可能指向一个 NSMutableString类的实例。这个类是NSString的子类,表示一种可修改其值的字符串,此时若是不拷贝字符串,那么设置完属性之后,字符串的值就可能会在对象不知情的情况下遭人更改。所以,这时就要拷贝一份“不可变”(immutable)的字符串,确保对象中的字符 值 会 意间变动。

只要实现属性所 的对象是“可变的” (mutable),就应该在设置新属性值时拷 

份。

举 说明:

定义 个以 strong 修饰的 array:

@property (nonatomic ,readwrite, strong) NSArray *array;

然后进 下 的操作:

NSArray *array = @[ @1, @2, @3, @4 ];

NSMutableArray *mutableArray = [NSMutableArray arrayWithArray:array];

self.array = mutableArray;

[mutableArray removeAllObjects];;

NSLog(@"%@",self.array);

[mutableArray addObjectsFromArray:array];

self.array = [mutableArray copy];

[mutableArray removeAllObjects];;

NSLog(@"%@",self.array);

打印结果如下所示:

CYLArrayCopyDmo (

)

CYLArrayCopyDmo(

1,

2,

3,

4

)

为  解这种做法, 先要知道,两种情况:

对 集合类对象的 copy 与 mutableCopy 操作;对集合类对象的 copy 与 mutableCopy 操作。

1. 对 集合类对象的copy操作:

在 集合类对象中:对 immutable 对象进  copy 操作,是指针复制,mutableCopy

操作时内容复制;对 mutable 对象进  copy 和 mutableCopy 都是内容复制。 代

码简单表示如下:

[immutableObject copy] // 浅复制

[immutableObject mutableCopy] //深复制

[mutableObject copy] //深复制

[mutableObject mutableCopy] //深复制

如以下代码:

NSMutableString *string = [NSMutableString stringWithString:@"origin"];

查看内存,会发现 string、stringCopy 内存地址都  样,说明此时都是做内容拷 、深拷 。即使你进 如下操作:

[string appendString:@"origion!"]

stringCopy 的值也 会因此改变,但是如果 使  copy,stringCopy 的值就会被改变。 集合类对象以此类推。 所以,

@property 声明 NSString、NSArray、NSDictionary 经常使  copy 关键字,是

因为他们有对应的可变类型:NSMutableString、NSMutableArray、

NSMutableDictionary,他们之间可能进 赋值操作,为确保对象中的字符 值 会

意间变动,应该在设置新属性值时拷  份。

你可能感兴趣的:(@property声明的NSString(或NSArray,NSDictionary)经常使 copy关键字,为什么?如果改用strong关键字,可能造成什么问题?)