天天看點

黑馬程式員_OC學習之block、protocol、categories

---------------------- ASP.Net+Unity開發、.Net教育訓練、期待與您交流! ----------------------

一、block:block是OC中特有的資料類型。作用與函數類似

定義:傳回值 (^myBlock)(形參類型) = ^(類型 形參//這裡如果沒有參數可以省略括号){//定義格式與指向函數的指針相似

//代碼

return ....;

}; //這裡不要忘加分号

例如:

<span style="font-size:18px;">#import <Foundation/Foundation.h>

typedef int (^myBlock) (int,int);   //每次定義都很麻煩,可以生成定義模版

int main() {
    
   __block int a = 0;
    int b = 1;
    
    int (^sumBlock)(int,int) = ^(int a, int b) {    //定義格式與指向函數的指針類似
      
        return a+b;
    };  //定義一個block
    
    myBlock minusBlock = ^(int a, int b) {  //用生成的模版定義
        
        return a-b;
    };

    void (^testBlock)() = ^ {
        a = 2;
//        b = 3;    //這句會報錯,因為預設block不可以修改局部變量
    };
    
    NSLog(@"a=%d,b=%d",a,b);
    
    NSLog(@"%d",sumBlock(2,4)); //調用方法與函數相同
    NSLog(@"%d",minusBlock(8,6));
    
    return 0;
    
}</span>
           

總結:

1、block内部可以通路外面的變量;

2、預設情況下,block内部不能修改外面的局部變量;

3、給局部變量加上__block關鍵字,這個局部變量就可以在block内部修改。

用途:

1、快速枚舉;

2、向方法中傳遞block;

3、靈活代碼。

--------------------------------------------------------------------------------------------------------------------------------------------------------

二、protocol(協定):類似于JAVA中的接口,用來聲明方法,通常用在代理模式中

用途:

1、可以用來聲明一大堆方法(不能聲明成員變量)

2、隻要某個類遵守了這個協定,就相當于擁有這個協定中的所有方法聲明

3、隻要父類遵守了某個協定,就相當于子類遵守了

例如:

<span style="font-size:18px;">#import <Foundation/Foundation.h>

@protocol myProtocol <NSObject>

@required   //必須實作方法(預設)

- (void)test;

@optional   //可選實作方法

- (void)test2;

@end

@interface Person : NSObject <myProtocol>

@end

@implementation Person

- (void)test {  //實作必須實作的方法,可選方法test2不實作也不會報警告
    
    NSLog(@"test");
}

@end

int main() {
    Person *p = [[Person alloc]init];
    
    [p test];
    
    [p release];
    
    return 0;
    
}</span>
           

總結:

1、一個協定可以遵守其他多個協定,多個協定之間用逗号隔開;

2、一個協定遵守了其他協定,就相當于擁有了其他協定中的方法聲明;

3、NSObject有一個基協定,最根本最基本的協定,協定中聲明了許多方法比如 description、retain、release等;

4、建議每個新的協定都要遵守NSObject協定。

三、categories(類别、分類、類目):不改變原來某類檔案的情況下為某一個類添加新的方法

例如:

#import <Foundation/Foundation.h>

@interface Person : NSObject

@end

@implementation Person

@end

@interface Person (J)
- (void)test;
@end

@implementation Person (J)  //為Person這個類添加一個分類,括号中填的是自己為該分類起的名字

- (void)test {
    NSLog(@"test");
}

@end

int main() {
    Person *p = [[Person alloc]init];
    
    [p test];
    
    return 0;
    
}
           

注意:catecoriges不可以為類添加成員變量。

---------------------- ASP.Net+Unity開發、.Net教育訓練、期待與您交流! ----------------------詳細請檢視:www.itheima.com