OC提供了一種與衆不同的方式-category,可以動態的爲已經存在 的類添加新的行爲(方法)
這樣可以保證類的原始設計規模較小,功能增加時,再逐一擴展
category使用簡單的方式,實現了類的相關方法的模塊化,把不同的類方法分配到不同的分類文件中。
新建一個文件,選擇category,然後category on 你要擴展的類:文件生成後,會這樣
注意:分類只能增加類的方法,不能增加成員變量。
Category使用場景:
1.在定義類時的某些情況下,(例如需求變更),你可能想要爲其中的某個或幾個類中添加新的方法:
2.一個類中包含了許多不同種類的方法需要實現,而這些方法需要不同團隊的成員實現
3.在使用基礎類庫中的類時,有可能希望這些類實現一些自己需要的方法,比如寫個NSString +JSON.h爲NSString這個類擴展一些解析,JSON的方法。
Protocol:(協議)
<>:表示實現某個協議。
協議的實現步驟:
1.制定一個協議,
@protocol ButtonDelegate <NSObject>
-(void)Onclick:(Button*)btn;
@end
2.設置監聽器:delegate :監聽器:
@interface Button : NSObject
@property (nonatomic,retain) id <ButtonDelegate> delegate;
-(void)click;
@end
模擬按鈕被點擊,如果點擊了,就通知監聽器。
-(void)click{
//respondsToSelector這個方法可以判斷一個代理有沒有實現協議中的方法。
//該函數返回類型類型是一個bool類型的。
if([_delegate respondsToSelector:@selector(Onclick:)]){
//如果按鈕被點擊了就通知監聽器;
[_delegate Onclick:self];
}else{
NSLog(@"監聽器沒有實心Onclick 方法 :");
}
}
Delegate實現了ButtonDelegate這個協議,然後協議裏面有一個onClick方法:
@autoreleasepool {
Button *button = [[[Button alloc]init]autorelease];
ButtonListener *listener = [[[ButtonListener alloc]init]autorelease];
MyListener *listener2 = [[[MyListener alloc]init]autorelease];
button.delegate=listener2;
[button click];
button.delegate=listener;
[button click];
}
如果button被點擊了,就會通知監聽器,按鈕被點擊了。這時候listener充當button的監聽器。
因爲協議裏面有一個方法,只要你滿足這個協議,就要實現它的方法,然後再實現了協議的文件裏面要實現在協議裏面定義的那個方法。
//協議的聲明,和@class一致。這也是爲了系統的
@protocol ButtonDelegate;
然後在.m文件裏面包含協議所在的那個頭文件
注意:一般情況下,如果你要實現一個協議的話,你就要把點擊了按鈕的那個對象給打印出來,然後也要判斷監聽器是否有協議所規定的方法:
拋出一個對象
-(void)Onclick:(Button*)btn;
判斷是否有迴應函數。
//respondsToSelector這個方法可以判斷一個代理有沒有實現協議中的方法。
//該函數返回類型類型是一個bool類型的。
if([_delegate respondsToSelector:@selector(Onclick:)]){
//如果按鈕被點擊了就通知監聽器;
[_delegate Onclick:self];
}else{
NSLog(@"監聽器沒有實心Onclick 方法 :");
}
NSObject :基類:成員方法:
1.iskindOfClass 和isMemberOfClass 的區別。
反射:
根據一個字符串,實例化一個對象。
1.。類的反射:
2.方法的反射: