您好,登錄后才能下訂單哦!
協議的定義與使用
什么是協議?
可以用來聲明一大堆方法(不能聲明成員變量)
只要某個類遵循了這個協議,就相當于擁有了這個協議中的所有方法聲明
只要父類遵守了某個協議,就相當于子類也遵守了
添加協議頭文件:Objective-C File —> protocol
協議類似于Java中的接口,類似于C++中的抽象類
定義協議:
@protocol 協議名 <父協議名1, 父協議名2, ...> … //方法聲明列表 @end
協議中的方法的限定:
@required 其后的方法要求在具體的類中必須實現
@optional 其后的方法要求在具體的類中選擇實現
遵循協議:
@interface 類名 : 父類 <協議名1, 協議名2, ...> … // @end
協議也可以遵守協議,相當于對現有協議的擴充
基協議NSObject:
該協議中聲明了如內存管理等基本方法,自定義協議一定要遵循這個基協議
類的對象屬性(復合的)需要指明該屬性遵循哪些協議:
@property (nonatomic, strong) 類名<協議名> * 屬性名; @property (nonatomic, strong) id<協議名> 屬性名;
也就是說,類名<協議名> 才表示一個確定的類型
協議可定義在單獨的.h文件中,也可以定在某個類的文件中
NSCopying協議
創建對象副本 ,使用copy或mutablecopy方法創建一個對象的副本
- (id) copy - (id) mutableCopy
淺復制
指針的拷貝,源對象和副本對象指向同一個對象
對象的引用計數+1,相當于做了一次retain。(內存管理)
深復制
內容的拷貝,源對象和副本對象指向不同的對象
源對象的引用計數不變,副本的引用計數為1
對象若想要調用copy方法必須遵循NSCopying協議,并實現方法:
- (id)copyWithZone:(NSZone *)zone
如:
- (id) copyWithZone:(NSZone *) zone { AMPerson * p = [[[self class] allocWithZone:zone] init]; p.age = self.age; p.name = [self.name copy]; return p; }
對象若想要調用mutableCopy方法必須遵循NSMutableCopying協議,并實現方法:
- (id)mutableCopyWithZone:(NSZone *)zone
NSCoding協議
NSKeyedArchiver歸檔器
+ (BOOL)archiveRootObject:(id)rootObject toFile:(NSString *)path + (NSData *)archivedDataWithRootObject:(id)rootObject
NSKeyedUnarchiver解檔器
+ (id)unarchiveObjectWithData:(NSData *)data + (id)unarchiveObjectWithFile:(NSString *)path
如果對象是NSString、NSDictionary、NSArray、NSData、NSNumber等類型,可以直接用NSKeyedArchiver進行歸檔。
如果是自定義的模型對象,模型對象需要遵循NSCoding協議,并實現方法:
- (void)encodeWithCoder:(NSCoder *)encoder - (instancetype)initWithCoder:(NSCoder *)decoder
NSCoder編碼器
encodeWithCoder:方法中應對打算歸檔的屬性進行編碼,使用encode開頭的方法。
initWithCoder:方法中應對歸檔中所有的數據進行解碼(到屬性),使用decode開頭的方法。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。