category和protocol 第五天稍晚了一些。

 OC提供了一種與衆不同的方式-category,可以動態的爲已經存在    的類添加新的行爲(方法)

 

 這樣可以保證類的原始設計規模較小,功能增加時,再逐一擴展

 category使用簡單的方式,實現了類的相關方法的模塊化,把不同的類方法分配到不同的分類文件中。

 

新建一個文件,選擇category,然後category on 你要擴展的類:文件生成後,會這樣


 

 

 

注意:分類只能增加類的方法,不能增加成員變量。

 

 

 

Category使用場景:

1.在定義類時的某些情況下,(例如需求變更),你可能想要爲其中的某個或幾個類中添加新的方法:

2.一個類中包含了許多不同種類的方法需要實現,而這些方法需要不同團隊的成員實現

3.在使用基礎類庫中的類時,有可能希望這些類實現一些自己需要的方法,比如寫個NSString +JSON.hNSString這個類擴展一些解析,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.方法的反射:

 


發佈了58 篇原創文章 · 獲贊 12 · 訪問量 10萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章