第22條:理解NSCopying協議
使某個類支援拷貝功能,只需宣告該類遵從NSCopying協議,並且實現copyWithZone方法即可。
- (id)copyWithZone:(NSZone *)zone
注意:
為何需要NSZone?
以前開發程式,會把記憶體分成不同的“區”(zone),而物件會建立在某個區裡。
現在不用了,一個程式只有一個區:“預設區”(default zone)。
不必在擔心其中的zone引數。
// 標頭檔案:
#import <Foundation/Foundation.h>
@interface EOCPerson : NSObject <NSCopying>
@property (nonatomic, copy, readonly) NSString *firstName;
@property (nonatomic, copy, readonly) NSString *lastName;
- (id)initWithFirstName:(NSString *)firstName
andLastName:(NSString *)lastName;
- (void)addFriend:(EOCPerson *)person;
- (void)removeFriend:(EOCPerson *)person;
@end
// 實現檔案:
#import "EOCPerson.h"
@implementation EOCPerson {
NSMutableSet *_friends;
}
- (id)initWithFirstName:(NSString *)firstName
andLastName:(NSString *)lastName
{
if ((self = [super init])) {
_firstName = [firstName copy];
_lastName = [lastName copy];
_friends = [NSMutableSet new];
}
return self;
}
- (void)addFriend:(EOCPerson *)person
{
[_friends addObject:person];
}
- (void)removeFriend:(EOCPerson *)person
{
[_friends removeObject:person];
}
- (id)copyWithZone:(NSZone *)zone
{
EOCPerson *copy = [[[self class] allocWithZone:zone]
initWithFirstName:_firstName
andLastName:_lastName];
// 使用->語法:friends不是屬性,只是一個例項變數
// _friends是一個可變set,不能共享,需要拷貝一份,如果是不可變的,那麼是不需要拷貝的。
copy->_friends = [_friends mutableCopy];
return copy;
}
@end
// 舉例:
EOCPerson *personA = [[EOCPerson alloc] initWithFirstName:@"Tom" andLastName:@"Too"];
EOCPerson *personB = [[EOCPerson alloc] initWithFirstName:@"Mark" andLastName:@"Moo"];
EOCPerson *personC = [[EOCPerson alloc] initWithFirstName:@"Yar" andLastName:@"Yoo"];
[personA addFriend:personB];
[personA addFriend:personC];
EOCPerson *copyPersonA = [personA copy];
通常情況,採用全能初始化方法來初始化拷貝的物件,但有時,會有一些“副作用”。
如果自定義物件還有可變版本,那麼需要遵從NSMutableCopying協議,並實現mutableCopyWithZone方法
- (id)mutableCopyWithZone:(NSZone *)zone;
淺拷貝:Foundation框架中所有collection類在預設情況下都是執行淺拷貝,只拷貝容器物件本身,而不復制其中的資料。
深拷貝:在拷貝容器物件自身時,也將其底層資料一併複製一份過去。
如果所寫的物件需要深拷貝,那麼可以考慮新增一個專門執行深拷貝的方法。
相關文章
- 第28條:通過協議提供匿名物件協議物件
- 理解NSCopying--Effective筆記筆記
- 理解http協議HTTP協議
- 理解ARP協議協議
- 理解 HTTPS 協議HTTP協議
- 深入理解OSPF協議協議
- 理解 OAuth2 協議OAuth協議
- https協議的理解HTTP協議
- 深入理解 HTTP 協議HTTP協議
- 理解 Redis 的 RESP 協議Redis協議
- 如何理解TCP/IP協議?TCP協議
- 關於wsgi協議的理解協議
- 深入理解TCP/IP協議TCP協議
- 深入理解 tcp 協議(一)TCP協議
- 深入理解HTTP協議(轉)HTTP協議
- 深入理解HTTPS協議HTTP協議
- 《TCP/IP詳解 卷1:協議》第3章 IP:網際協議TCP協議
- Http網路協議包 (快速理解)HTTP協議
- 課時6.HTTP協議(理解)HTTP協議
- 快速理解網路通訊協議協議
- 從效能角度幫你理解HTTP協議HTTP協議
- 【BGP乾貨】怎麼理解BGP協議?協議
- 深入理解 Web 協議 (三):HTTP 2Web協議HTTP
- 透過原始碼理解Rarp協議原始碼協議
- HTTP協議理解與應用總結HTTP協議
- [HTTP 系列] 第 2 篇 —— HTTP 協議那些事HTTP協議
- 10分鐘理解TCP/IP各個協議以及協議之間的關係TCP協議
- 【網路協議】IP協議、ARP協議、RARP協議協議
- 理解HTTP協議中的multipart/form-dataHTTP協議ORM
- 理解OIDC協議和認證機制協議
- 重新理解RocketMQ Commit Log儲存協議MQMIT協議
- SSH 協議埠號 22 背後的故事協議
- RTSP協議、RTMP協議、HTTP協議的區別協議HTTP
- Wireshark資料抓包分析(網路協議篇)第1章網路協議抓包概述協議
- 《TCP/IP詳解卷1:協議》第4章 ARP:地址解析協議-讀書筆記TCP協議筆記
- 《TCP/IP詳解卷1:協議》第3章 IP:網際協議(2)-讀書筆記TCP協議筆記
- 《TCP/IP詳解卷1:協議》第3章 IP:網際協議(1)-讀書筆記TCP協議筆記
- 理解OAuth2.0協議和授權機制OAuth協議