- 需求:一個對象數(shù)組,然后想將這個數(shù)組拷貝出來一份用,修改拷貝的這份數(shù)組,保持原始數(shù)據(jù)不被改變.
- 如果數(shù)組的元素是對象(比如是個model) 需要實(shí)現(xiàn),
<NSCopying,NSMutableCopying>
(NSMutableArray,NSArray,NSString等實(shí)現(xiàn)了該協(xié)議)
- 協(xié)議對應(yīng)方法:
- (id)copyWithZone:(nullable NSZone *)zone
- (id)mutableCopyWithZone:(nullable NSZone *)zone
- 舉例:
實(shí)現(xiàn) NSCopying,NSMutableCopying 協(xié)議
如果用NSCopying 實(shí)現(xiàn):
- (id)copyWithZone:(nullable NSZone *)zone
如果用NSMutableCopying 實(shí)現(xiàn):
- (id)mutableCopyWithZone:(nullable NSZone *)zone
Model
@interface Model : NSObject<NSCopying,NSMutableCopying>
@property (nonatomic, copy) NSString *str1;
@property (nonatomic, copy) NSString *str2;
@end
@implementation Model
- (id)copyWithZone:(nullable NSZone *)zone{
Model *person = [[self class] allocWithZone:zone];
person.str1 = [_str1 copy];
person.str2 = [_str2 copy];
return person;
}
- (id)mutableCopyWithZone:(nullable NSZone *)zone{
Model *person = [[self class] allocWithZone:zone];
person.str1 = [_str1 copy];
person.str2 = [_str2 copy];
return person;
}
@end
- 實(shí)現(xiàn)了協(xié)議以后,那么該對象就可以進(jìn)行拷貝了,下面說說數(shù)組是怎么回事
//構(gòu)造一個Model 數(shù)組
NSMutableArray *arr = [NSMutableArray array];
for (int i = 0; i< 3; i++) {
Model *model = [[Model alloc] init];
model.str1 = @"1";
model.str2 = @"2";
NSLog(@"數(shù)組%d:---%p",i,model);
[arr addObject:model];
}
那么我想拷貝數(shù)組對象,直接
NSMutableArray *arr1 = [arr mutableCopy];
是不是這樣就可以了
arr內(nèi)存地址:0x7f8d8b7972a0
arr1內(nèi)存地址:0x7f8d8b796fe0
顯然是不一樣的,那么你會說這樣就可以了,其實(shí)你想多了,斷點(diǎn)后看兩個數(shù)組的元素的地址改變了沒有:
結(jié)果:po arr
<__NSArrayM 0x7f8d8b7972a0>(
<Model: 0x7f8d8b78f110>,
<Model: 0x7f8d8b52b470>,
<Model: 0x7f8d8b408830>
)
po arr1
<__NSArrayM 0x7f8d8b796fe0>(
<Model: 0x7f8d8b78f110>,
<Model: 0x7f8d8b52b470>,
<Model: 0x7f8d8b408830>
)
- 元素對象是一樣的,地址完全一樣,所以說數(shù)組的指針變了,但是數(shù)組元素是沒有變的,該如何解決呢?先上一段代碼.
NSMutableArray *arr = [NSMutableArray array];
for (int i = 0; i< 3; i++) {
Model *model = [[Model alloc] init];
model.str1 = @"1";
model.str2 = @"2";
NSLog(@"數(shù)組%d:---%p",i,model);
[arr addObject:model];
}
NSMutableArray *arr1 = [NSMutableArray array];
for (Model *model in arr) {
[arr1 addObject:[model copy]];//這里的copy,就是將arr數(shù)組里的每一個對象拷貝一份.
//所以Model對象實(shí)現(xiàn)- (id)copyWithZone:(nullable NSZone *)zone方法
}
-
解決方法
- 目前我想到的是遍歷數(shù)組 將數(shù)組元素深拷貝出來添加到另一個數(shù)組里.如果有同學(xué)想到了其他更好的方法希望能告知我,謝謝.
最后編輯于 :
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者