第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條:通過協議提供匿名物件協議物件
- 理解http協議HTTP協議
- https協議的理解HTTP協議
- 深入理解 HTTP 協議HTTP協議
- 如何理解TCP/IP協議?TCP協議
- 深入理解OSPF協議協議
- 理解 OAuth2 協議OAuth協議
- 關於wsgi協議的理解協議
- 深入理解 tcp 協議(一)TCP協議
- 快速理解網路通訊協議協議
- 課時6.HTTP協議(理解)HTTP協議
- 透過原始碼理解Rarp協議原始碼協議
- Http網路協議包 (快速理解)HTTP協議
- 《TCP/IP詳解 卷1:協議》第3章 IP:網際協議TCP協議
- 重新理解RocketMQ Commit Log儲存協議MQMIT協議
- 理解OIDC協議和認證機制協議
- 【BGP乾貨】怎麼理解BGP協議?協議
- 從效能角度幫你理解HTTP協議HTTP協議
- 深入理解 Web 協議 (三):HTTP 2Web協議HTTP
- [HTTP 系列] 第 2 篇 —— HTTP 協議那些事HTTP協議
- 理解HTTP協議中的multipart/form-dataHTTP協議ORM
- 第8條:理解“物件等同性”這一概念物件
- zigbee協議棧OSAL執行原理-----個人理解協議
- 理解OAuth2.0協議和授權機制OAuth協議
- Raft協議和ZAB協議Raft協議
- Gossip協議也叫Epidemic協議(流行病協議)Go協議IDE
- 深入理解 web 協議(一)- http 包體傳輸Web協議HTTP
- OSI 七層網路協議的定義與理解協議
- 基於應用理解的協議棧最佳化協議
- 前後端高效協作開發的11條建議後端
- 每週分享第 22 期
- 頁面連結跳轉--指定協議,半協議,無協議協議
- 協議協議
- 在Linux中,如何理解Tcp/ip協議三次握手?LinuxTCP協議
- 淺談WebSocket協議、WS協議和WSS協議原理及關係Web協議
- USB協議詳解第11講(USB描述符-總結)協議
- 第 22 章 備忘錄模式模式
- Gossip協議和Grpc協議的區別Go協議RPC