diff --git "a/iOS\347\237\245\350\257\206\347\202\271/iOS\345\272\225\345\261\202/\345\206\205\345\255\230\347\256\241\347\220\206/3\343\200\201copy&retain&strong\345\216\237\347\220\206.md" "b/iOS\347\237\245\350\257\206\347\202\271/iOS\345\272\225\345\261\202/\345\206\205\345\255\230\347\256\241\347\220\206/3\343\200\201copy&retain&strong\345\216\237\347\220\206.md" index 404e86f..80beb81 100644 --- "a/iOS\347\237\245\350\257\206\347\202\271/iOS\345\272\225\345\261\202/\345\206\205\345\255\230\347\256\241\347\220\206/3\343\200\201copy&retain&strong\345\216\237\347\220\206.md" +++ "b/iOS\347\237\245\350\257\206\347\202\271/iOS\345\272\225\345\261\202/\345\206\205\345\255\230\347\256\241\347\220\206/3\343\200\201copy&retain&strong\345\216\237\347\220\206.md" @@ -244,6 +244,48 @@ self.strCopy,self.strCopy,&_strCopy); **在实际开发中,我们不希望源数据改变影响到属性中的值,故而使用copy来申明。** +为了理解这种做法,首先要知道,两种情况: + +对非集合类对象的 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"];//copy +NSString *stringCopy = [string copy]; +查看内存,会发现 string、stringCopy 内存地址都不一样,说明此时都是做内容拷贝、深拷贝。即使你进行如下操作: + +[string appendString:@"origion!"] +stringCopy 的值也不会因此改变,但是如果不使用 copy,stringCopy 的值就会被改变。 集合类对象以此类推。 所以, + +用 @property 声明 NSString、NSArray、NSDictionary 经常使用 copy 关键字,是因为他们有对应的可变类型:NSMutableString、NSMutableArray、NSMutableDictionary,他们之间可能进行赋值操作,为确保对象中的字符串值不会无意间变动,应该在设置新属性值时拷贝一份。 + +2、集合类对象的copy与mutableCopy +集合类对象是指 NSArray、NSDictionary、NSSet ... 之类的对象。下面先看集合类immutable对象使用 copy 和 mutableCopy 的一个例子: + +NSArray *array = @[@[@"a", @"b"], @[@"c", @"d"]]; +NSArray *copyArray = [array copy]; +NSMutableArray *mCopyArray = [array mutableCopy]; +查看内容,可以看到 copyArray 和 array 的地址是一样的,而 mCopyArray 和 array 的地址是不同的。说明 copy 操作进行了指针拷贝,mutableCopy 进行了内容拷贝。但需要强调的是:此处的内容拷贝,仅仅是拷贝 array 这个对象,array 集合内部的元素仍然是指针拷贝。这和上面的非集合 immutable 对象的拷贝还是挺相似的,那么mutable对象的拷贝会不会类似呢?我们继续往下,看 mutable 对象拷贝的例子: + +NSMutableArray *array = [NSMutableArray arrayWithObjects:[NSMutableString stringWithString:@"a"],@"b",@"c",nil]; +NSArray *copyArray = [array copy]; +NSMutableArray *mCopyArray = [array mutableCopy]; +查看内存,如我们所料,copyArray、mCopyArray和 array 的内存地址都不一样,说明 copyArray、mCopyArray 都对 array 进行了内容拷贝。同样,我们可以得出结论: + +在集合类对象中,对 immutable 对象进行 copy,是指针复制, mutableCopy 是内容复制;对 mutable 对象进行 copy 和 mutableCopy 都是内容复制。但是:集合对象的内容复制仅限于对象本身,对象元素仍然是指针复制。用代码简单表示如下: + +[immutableObject copy] // 浅复制 +[immutableObject mutableCopy] //单层深复制 +[mutableObject copy] //单层深复制 +[mutableObject mutableCopy] //单层深复制 +这个代码结论和非集合类的非常相似。