標籤:
Block資料類型
Block封裝了一段代碼 可以在任何時候執行
Block可以作為函數參數或者函數的傳回值 而其本身又可以帶輸入參數或傳回值
蘋果官方建議盡量多用Block 在多線程 非同步任務 集合遍曆 集合排序 動畫轉場用的很多
定義Block變數
void (^myBlock) ();
int (^sunBlock) (int, int);
利用Block封裝代碼
^ {
NSLog(@"==========");
};
^() {
NSLog(@"=========");
};
^(int a, int b) {
return a + b;
};
Block訪問外面變數
Block 內部可以訪問外面的變數
預設情況下 Block內部不能修改外面的局部變數
給局部變數加上__block關鍵字 這個局部變數就可以在Block內部修改
利用typedef定義Block類型
typedef int (^MyBlock) (int, int); //以後就可以利用MyBlock這種類型來定義Block變數
MyBlock block;
MyBlock b1, b2;
b1 = ^(int a, int b) {
return a + b;
};
MyBlock b3 = ^(int a, int b) {
return a + b;
};
@protocol關鍵字
可以用來聲明一大堆方法 (不能聲明成員變數)
只要某個類遵守了這個協議 就相當於擁有這個協議中的所有方法聲明
只要父類遵守了某個協議 就相當於子類也遵守了
協議的編寫格式
@protocol 協議名稱 <NSObject>
//方法聲明列表
@end
某個類遵守協議
@interface 類名 : 父類 <協議名稱1, ...>
@end
協議遵守協議
一個協議遵守了另外一個協議 就可以擁有另一個協議的所有方法聲明
@protocol 協議名稱 <協議名稱1, ...>
//方法聲明列表
@end
協議中方法聲明的關鍵字
@required 要求實現 不實現會有警告 (預設)
@optionnal 可選實現
基協議
NSObject是一個基類 任何其他類最終都要繼承它
還有一個NSObject基協議 聲明了許多最基本的方法 比如 description retain release 等等
建議每一個新的協議都遵守NSObject基協議
定義一個變數時 限制這個變數儲存的對象遵守某個協議
類名<協議名稱> *變數名;
id<協議名稱> 變數名;
NSObject<MyProtocol> *obj = [[NSObject alloc] init];
@property (nonatomic, strong) id<MyProtocol> obj;
如果沒有遵守對應的協議 編譯器就會報錯
Objective-C Block資料類型 @protocol關鍵字