最近有個需求需要copy數組對象才發(fā)現之前一直不太了解深淺copy就隨手寫了個小demo研究下。
1拂苹,NSObject中的copy和mutableCopy方法
NSString *str = @"aaaa";
NSString *copyStr = [str copy];
NSString *mutableCopyStr = [str mutableCopy];
NSLog(@"str = %p, copy = %p, mutableCopy = %p",str,copyStr,mutableCopyStr);
打印結果:str = 0x10abea068, copy = 0x10abea068, mutableCopy = 0x60400025ca70
對于NSString對象來說copy方法并沒有實現深copy瓢棒。( str對象和copy指向同一地址)
mutableCopy方法實現了深copy。
NSMutableString *str1 = [[NSMutableString alloc]initWithString:@"aaaa"];
NSMutableString *copy1 = [str1 copy];
NSMutableString *mutableCopy1 = [str1 mutableCopy];
NSLog(@"str1 = %p , copy = %p , mutableCopy = %p",str1,copy1,mutableCopy1);
打印結果: ? str1 = 0x60400025cf20 , copy = 0xa000000616161614 , mutableCopy = 0x60400025cce0
?[str1 appendString:@"bbbb"];
? NSLog(@"str1 = %@ , copy = %@ , mutableCopy = %@",str1, copy1,mutableCopy1);
打印結果: ?? str1 = aaaabbbb , copy = aaaa , mutableCopy = aaaa
對于NSMutableString對象來說mutableCopy和copy都實現了深copy念颈。
經測試NSArray榴芳,NSDictionary等對象和NSString一樣copy淺copy mutableCopy深copy
NSMutableArray,NSMutableDictionary等可變對象和NSMutableString一樣copy和mutableCopy實現了深copy
自定義Person類實現NSCopying協(xié)議
@interface Person : NSObject<NSCopying>
@property (strong, nonatomic) NSString *name;
@end
#import "Person.h"
@implementation Person
- (id)copyWithZone:(NSZone *)zone {
Person *p = [Person new];
p.name = _name;
return p;
}
@end
Person *p = [[Person alloc]init];
p.name= @"kk";
Person *p1 = [p copy];
p1.name = @"kkoo";
NSLog(@"p name = %@ , p1 name = %@", p.name,p1.name);
打印結果p name = kk , p1 name = kkoo
通過copy或者mutableCopy可以實現深copy
2跺撼,深copy對象數組
?Person *p = [[Person alloc]init];
?p.name= @"kk";
NSArray *arr = @[p];
NSArray *arr1 = [arr mutableCopy];
NSLog(@"arr = %p, arr1 = %p", arr, arr1);
打印結果:arr = 0x604000009cf0, arr1 = 0x6040004579d0财边。? 深copy數組
Person *p_arr = arr[0];
Person *p_arr1 = arr1[0];
NSLog(@"p_arr = %p, p_arr1 = %p",p_arr,p_arr1);
打印結果:p_arr = 0x60000001f6d0, arr1 = 0x60000001f6d0
數組里面對象并沒有得到深copy
此時大致能想到兩種方法真正實現對象數組的深copy
第一種,重新聲明一個數組對象谍夭,遍歷之前的數組對象調用Person的copy方法插入新數組
NSMutableArray *arr3 = [NSMutableArray array];
for (Person *person in arr) {
Person *tmpPerson = [person copy];
[arr3 addObject:tmpPerson];
}//或者不用copy方法直接初始化新的Person對象插進數組
得到arr3實現數組對象arr的深copy
第二種憨募,利用歸檔的方法重新獲得數組
在Person 類中實現NSCoding協(xié)議
- (void)encodeWithCoder:(NSCoder *)aCoder {
[aCoder encodeObject:_name forKey:@"name"];
}
- (instancetype)initWithCoder:(NSCoder *)aDecoder {
self = [super init];
if (self) {
_name = [aDecoder decodeObjectForKey:@"name"];
}
return self;
}
NSArray *arr4 = [NSKeyedUnarchiver unarchiveObjectWithData:[NSKeyedArchiver archivedDataWithRootObject:arr]];
得到arr4實現數組對象arr的深copy