一言沐、協(xié)議:
默認繼承NSObjct對象邓嘹,可供其所有子類遵守協(xié)議,進而實現(xiàn)協(xié)議方法险胰。
- Protocol.h 協(xié)議文件
#import <Foundation/Foundation.h>
@protocol Protocol <NSObject>
// 此處定義方法汹押,默認是必須實現(xiàn)的
// 可采取修飾符定義方法是否必須實現(xiàn)
@end
- Example.h 頭文件
#import <Foundation/Foundation.h>
#import "Protocol.h"
@interface Example : NSObject <Protocol>
@end
- Example.m 實現(xiàn)文件
#import "Example.h"
@implementation Example
// @required修飾的方法必須實現(xiàn)
// @optional修飾的方法視需要實現(xiàn)
@end
二、代理:
代理類同協(xié)議起便,區(qū)別在于其含有委托對象棚贾、以及代理對象去執(zhí)行代理方法。
- ObjectDelegate.h 代理文件
#import <Foundation/Foundation.h>
@class Client;
@protocol ObjectDelegate <NSObject>
// 代理方法的聲明, 該代理方法參數(shù)中應(yīng)該包含委托對象
@end
- Client.h 委托對象頭文件
#import <Foundation/Foundation.h>
#import "ObjectDelegate.h"
@interface Client : NSObject {
id <ObjectDelegate> _delegate;
}
- (void)setDelegate:(id <ObjectDelegate>) delegate;
@end
- Client.m 委托對象實現(xiàn)文件
#import "Example.h"
@implementation Client
- (void)setDelegate:(id <ObjectDelegate>)delegate {
_delegate = delegate;
}
// 可根據(jù)需要在某些方法中進行代理方法的回調(diào)進行傳值
@end
- Agent.h 代理對象遵守代理
#import <Foundation/Foundation.h>
#import "ObjectDelegate.h"
@interface Agent : NSObject <ObjectDelegate>
@end
- Agent.m 代理對象實現(xiàn)代理方法
#import "Agent.h"
#import "Client.h"
@implementation Agent
// 代理方法的實現(xiàn)
@end
三缨睡、類目:
- 類目的注意事項歸納為三點:
- 類目可以覆寫原始類的方法, 不能為原始類擴展實例屬性鸟悴。但擴展系統(tǒng)類時候不建議做, 因為覆寫后原始類的方法將不可用陈辱。
- 類目文件的方法聲明以及實現(xiàn)奖年。使得在不得知父類文件的前提下,可以對已有的類進行擴展沛贪,且不破壞原結(jié)構(gòu)陋守。
- 類目給類增加的這些方法,也是可以被子類繼承的
- 類目的文件命名規(guī)則:類目+類目名稱 如"Example + Ext"
- 與創(chuàng)建子類進行擴展進行比較:
- 采取增加子類的方法來擴展, 容易造成父子關(guān)系混淆, 在眾多文件中不方便找到所需的經(jīng)過擴展的父類來進行繼承利赋。
- 一般情況下的類目, 為現(xiàn)有類擴展(增加)新的方法, 擴展的方法會成為原始類的一部分,各個文件均可以訪問, 且不破壞原結(jié)構(gòu)水评。
- Example+Ext.h 類目頭文件
#import "Example.h"
@interface Example (Ext)
// 擴展方法的聲明
@end
- Example+Ext.m 類目實現(xiàn)文件
#import "Example+Ext.h"
@implementation Example (Ext)
// 擴展方法的實現(xiàn)
@end
四、延展:
- 簡單的說, 延展就是匿名類目, 僅僅可添加方法且方法的實現(xiàn)需要去原有類中的實現(xiàn)文件進行實現(xiàn)媚送。
- 命名規(guī)則為"類目+延展名稱" 如"ExampleExtension"
- 對類進行方法擴展中燥,分兩種方式:
- 在定義的延展文件中,敘寫擴展方法塘偎,到延展類中進行延展文件導(dǎo)入疗涉,并實現(xiàn)方法
- 在延展類中,直接定義
- ExampleExtension.h 延展文件
#import "Example.h"
@interface Example ()
// 延展方法的聲明
@end
- Example.m 導(dǎo)入延展文件
#import "Example.h"
#import "ExampleExtension.h"
@implementation Example
// 延展方法的實現(xiàn)
@end
- Example.m 實現(xiàn)文件直接定義
#import "Example.h"
@interface Example (private)
// private可省略吟秩,但是括號要留下
// 擴展方法的聲明
@end
@implementation Example
/*
.m文件中的私有和.h文件中的@private私有有點區(qū)別
閉源的文件只能看到.h文件
開源的可以看到.h, 也可以看到.m
*/
// 擴展方法的實現(xiàn)
@end
總結(jié)
- 協(xié)議和延展:均是一個頭文件聲明函數(shù)咱扣,去遵守協(xié)議或被延展的原文件里進行函數(shù)實現(xiàn)
- 類目和延展:就是一個匿名與不匿名的關(guān)系,以及方法實現(xiàn)的位置不同
- 協(xié)議和多態(tài):可以說協(xié)議是提供一個方法列表涵防,誰去遵守協(xié)議就可以實現(xiàn)方法闹伪,可以達到多態(tài)的效果
- 但是多態(tài)是繼承父類的關(guān)系,相較協(xié)議來說壮池,可以繼承父類的變量以及父類獨有而子類共有的方法
只想日后回頭看看來時的路偏瓤,能發(fā)現(xiàn)自己并不是一無所有。