AFNetworking 知識點1--NSCopying NSMutableCopying
阿新 • • 發佈:2018-03-30
bject 地址 nss AD 有關 技術分享 可能 相關 afnetwork 1.NSCopying ————> - (id)copy;
NSCopying是一個與對象拷貝有關的協議。如果想讓一個類的對象支持拷貝,就需要讓該類實現NSCopying協議。
NSCopying協議中的聲明的方法只有一個- (id)copyWithZone:(NSZone *)zone。
當我們的類實現了NSCopying協議,通過類的對象調用copy方法時,copy方法就會去調用我們實現的- (id)copyWithZone:(NSZone *)zone方法,實現拷貝功能。
- (id)copyWithZone:(NSZone *)zone{
PersonModel *model = [[[self class] allocWithZone:zone] init];
model.firstName = self.firstName;
model.lastName = self.lastName;
//未公開的成員 model->_nickName = _nickName; return model;
}
說明:在- (id)copyWithZone:(NSZone *)zone方法中,一定要通過[self class]方法返回的對象調用allocWithZone:方法。
因為指針可能實際指向的是PersonModel的子類。這種情況下,通過調用[self class],就可以返回正確的類的類型對象。
例如: B = A.copy. 對對象進行copy操作,會得到一個新的對象,但是其屬性,其指針跟之前是同一個地址。 A屬性值改變時,同一個地址B的值也會改變。 A屬性地址如果變了,B的值不會受到影響。B還是指向原先的地址。 註意: NSString , NSArray,NSDictionary,NSSet 進行copy 不會產生新的對象。 2.NSMutableCopying - (id)mutableCopy; NSCopying協議與NSMutableCopying的區別主要是在於,返回的對象是否是可變類型的。以Foundation框架的NSArray為例 NSArray *nameArray = @[@"Jim", @"Tom", @"David"]; NSArray *copyArray = [nameArray copy]; NSMutableArray *mutableCopyArray = [nameArray mutableCopy]; [mutableCopyArray addObject:@"Sam”] NSArray對象調用copy方法時,copy方法會調用- (id)copyWithZone:(NSZone *)zone,得到對象的一份拷貝,但得到的對象還是不可變的對象。而NSArray對象調用mutableCopy方法時,mutableCopy方法會調用- (id)mutableCopyWithZone:(NSZone *)zone,得到可變的對象。 所以,如果自定義類具有可變和不可變的區別,想讓它支持拷貝時,就需要同時實現NSCopying和NSMutableCopying,在- (id)copyWithZone:(NSZone *)zone返回的是不可變對象,在- (id)mutableCopyWithZone:(NSZone *)zone返回的是可變對象。 @property (nonatomic, copy) NSString *string; 對於NSString , NSArray,NSDictionary ,要使用copy關鍵字。 因為其子類存在mutable 版本,使用strong,指向的是同一個地址,其值如果改動,都會改動。 舉例: @property (nonatomic, strong) NSString *string; NSMutableString *string = [NSMutableString stringWithString:@"哇"]; self.string = string; [string appendString:@"哈哈"]; NSLog(@"%@",self.string); 淺拷貝和深拷貝 深拷貝:在拷貝對象自身時,將其底層數據也一並復制過去 Foundation框架中的所有collection類在默認情況下都執行淺拷貝,也就是說,只拷貝容器對象本身,而不復制其中數據。 淺拷貝之後的內容和原始內容均指向相同對象。 而深拷貝之後的內容所指的對象是原始內容中相關對象的一份拷貝。
想要實現深拷貝,像數組,字典,集合 要實現下面這些方法。
- //無子類是可以這樣實現
- Fraction *newFract = [[Fraction allocWithZone:zone] init];
- //有子類時,需要這樣實現
- Fraction *newFract = [[[self class] allocWithZone:zone] init];
例如: B = A.copy. 對對象進行copy操作,會得到一個新的對象,但是其屬性,其指針跟之前是同一個地址。 A屬性值改變時,同一個地址B的值也會改變。 A屬性地址如果變了,B的值不會受到影響。B還是指向原先的地址。 註意: NSString , NSArray,NSDictionary,NSSet 進行copy 不會產生新的對象。 2.NSMutableCopying - (id)mutableCopy; NSCopying協議與NSMutableCopying的區別主要是在於,返回的對象是否是可變類型的。以Foundation框架的NSArray為例 NSArray *nameArray = @[@"Jim", @"Tom", @"David"]; NSArray *copyArray = [nameArray copy]; NSMutableArray *mutableCopyArray = [nameArray mutableCopy]; [mutableCopyArray addObject:@"Sam”] NSArray對象調用copy方法時,copy方法會調用- (id)copyWithZone:(NSZone *)zone,得到對象的一份拷貝,但得到的對象還是不可變的對象。而NSArray對象調用mutableCopy方法時,mutableCopy方法會調用- (id)mutableCopyWithZone:(NSZone *)zone,得到可變的對象。 所以,如果自定義類具有可變和不可變的區別,想讓它支持拷貝時,就需要同時實現NSCopying和NSMutableCopying,在- (id)copyWithZone:(NSZone *)zone返回的是不可變對象,在- (id)mutableCopyWithZone:(NSZone *)zone返回的是可變對象。 @property (nonatomic, copy) NSString *string; 對於NSString , NSArray,NSDictionary ,要使用copy關鍵字。 因為其子類存在mutable 版本,使用strong,指向的是同一個地址,其值如果改動,都會改動。 舉例: @property (nonatomic, strong) NSString *string; NSMutableString *string = [NSMutableString stringWithString:@"哇"]; self.string = string; [string appendString:@"哈哈"]; NSLog(@"%@",self.string); 淺拷貝和深拷貝 深拷貝:在拷貝對象自身時,將其底層數據也一並復制過去 Foundation框架中的所有collection類在默認情況下都執行淺拷貝,也就是說,只拷貝容器對象本身,而不復制其中數據。 淺拷貝之後的內容和原始內容均指向相同對象。 而深拷貝之後的內容所指的對象是原始內容中相關對象的一份拷貝。
AFNetworking 知識點1--NSCopying NSMutableCopying