前言
上周說了一下[iOS開發(fā)]關(guān)于copy屬性的一個細節(jié)點,說的是copy屬性的作用以及在重寫copy屬性的setter方法的時候需要注意的細節(jié),如果讀者有興趣可以會看這篇簡書,本文將在上一篇的基礎(chǔ)上來看一個實際開發(fā)中的copy注意點.
開發(fā)案例
網(wǎng)絡(luò)請求基本是移動開發(fā)必不可少的一部分了,關(guān)于網(wǎng)絡(luò)請求返回的數(shù)據(jù)(通常是json),我們通常是先進行解析再對其進行模型的封裝,曾經(jīng)在這個地方我遇到過一個可愛的問題.
當時我需要對一個網(wǎng)絡(luò)請求返回的數(shù)據(jù)A,在B和C兩處分別進行使用,那copy方法是沒跑了
Student *s1 = ({
Student *student = [[Student alloc] init];
student.name = @"s1";
student.score = 100;
student;
});
Student *s2 = ({
Student *student = [[Student alloc] init];
student.name = @"s2";
student.score = 90;
student;
});
NSMutableArray *array_m = [NSMutableArray arrayWithObjects:s1,s2,nil];
NSArray <Student *>*array = [array_m copy];
NSArray <Student *>*array2 = [array_m copy];
({ })是GCC寫法我在之前寫的[iOS開發(fā)]方法的封裝之鏈式編程也使用過,別看書寫起來行數(shù)可能更多,可是復(fù)用性和閱讀便利性可是杠杠的.
先介紹一下Student這個類
#import <Foundation/Foundation.h>
@interface Student : NSObject
@property (nonatomic, assign) NSUInteger score;
@property (nonatomic, copy) NSString *name;
@end
array_m是自己處理好的模型數(shù)組(處理時肯定是可變數(shù)組),在我們使用這些數(shù)據(jù)的時候一般我們都是得到一個不可變的模型數(shù)組,此時需要對處理后的模型數(shù)組進行copy得出不可變數(shù)組.
之前我說了這是一個可愛的錯誤,為什么可愛呢,請看
array[0].name = @"xxx";
NSLog(@"array2[0].name = %@",array2[0].name);
輸出結(jié)果是
array2[0].name = xxx
這里打印一下兩個數(shù)組的地址
NSLog(@"arrayP = %p",array);
NSLog(@"array2P = %p",array2);
地址結(jié)果是
arrayP = 0x600000026c40
array2P = 0x600000026c60
說明copy成功了,這確實是兩個不同的數(shù)組,在這一瞬間思路感覺都要斷了.......................
可愛的自己
誰說過對數(shù)組進行copy里面元素也會自行copy的?簡直是自己一廂情愿,打印一下看看咯
NSLog(@"array[0]P = %p",array[0]);
NSLog(@"array2[0]P = %p",array2[0]);
真是可愛^ ^
array[0]P = 0x610000023920
array2[0]P = 0x610000023920
此刻我們還需要對數(shù)組中的每一個元素進行copy
NSMutableArray *arrayM = ({
NSMutableArray *mutableArray = [NSMutableArray array];
for (Student *stu in array_m) {
Student *newStu = [stu copy];
[mutableArray addObject:newStu];
}
mutableArray;
});
NSMutableArray *arrayM2 = ({
NSMutableArray *mutableArray = [NSMutableArray array];
for (Student *stu in array_m) {
Student *newStu = [stu copy];
[mutableArray addObject:newStu];
}
mutableArray;
});
NSArray <Student *>*array = [arrayM copy];
NSArray <Student *>*array2 = [arrayM2 copy];
得出最終兩個名叫array和array2的可變數(shù)組
這里注意要讓Student這個類遵守NSCopying協(xié)議,并實現(xiàn)copyWithZone方法
//深拷貝為了得到地址不同的數(shù)據(jù),因為有兩個地方要用到
- (id)copyWithZone:(NSZone *)zone{
Student *student=[[[self class] allocWithZone:zone] init];
student.name=[_name copy]; //深拷貝
//score屬性是基本數(shù)據(jù)類型不需拷貝
return student;
}
這里要注意的是如果Student的屬性中還有其他的自定義對象,如需進行復(fù)制,請為其實現(xiàn)copyWithZone方法
這樣在之后你會發(fā)現(xiàn)array和array2才是內(nèi)容相同地址空間根本不同的兩個數(shù)組.在你任意使用其中一組數(shù)據(jù)的時候不會影響到另一組數(shù)據(jù).
這種可愛的錯誤可別犯第二次
版權(quán)聲明:本文版權(quán)歸本文作者所有凌外,始發(fā)于簡書淋淀,如需轉(zhuǎn)載請聯(lián)系作者纱皆,違者必究.