標籤:objective-c ios xcode 對象 類 物件導向
什麼是協議?
可以用來聲明一大堆方法(不能聲明成員變數)
只要某個類遵循了這個協議,就相當於擁有了這個協議中的所有方法聲明
只要父類遵守了某個協議,就相當於子類也遵守了
添加協議標頭檔: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檔案中,也可以定在某個類的檔案中
建立對象副本 ,使用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
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開頭的方法。
本文出自 “teacherAn” 部落格,請務必保留此出處http://annmeng.blog.51cto.com/3321237/1745627
Objective-C(10)抽象父類---協議