Block可以當物件傳遞碉碉,可以變成某個對象的property,或是當做method/function 的參數(shù)傳遞,所有經(jīng)常用作 callback。
寫法:
returnType (^blockName)(parameterTypes) = ^returnType(parameterTypes) {...};
//右邊可不帶returnType
oc property 寫法
@property (nonatomic, copy) returnType (^blockName)(parameterTypes)峡蟋;
callback 寫法
- (void)someMethodTakesABlock:(returnType (^)(int ,int ))blockName {...}
[someObject someMethodTakesABlock:^returnType (parameterTypes) {...}];
typedef 寫法
typedef returnType (^TypeName)(parameterTypes);
TypeName blockName = ^returnType(parameterTypes) {...};
什么時候使用block
如果一個 method 或 fund 的呼叫只有單一的 callback,那么就使用 block华望,如果可能會有多個不同的 callback蕊蝗,那么就是用 delegate。
__block 關鍵詞
對我們目前所在的 block 中來說赖舟,所有的外部的變量只是可讀不可寫蓬戚;至于在block里面用到的oc對象,會被 retain 一次建蹄。
__block int i = 1;
void (^block)(void) = ^{
i = i + 1;
};
__weak 關鍵詞
由于在block里面用到的oc對象碌更,會被 retain 一次,這個oc對象也包括 self洞慎,所有痛单,假使有個對象的 property 是個 block,而這個 block 里面又用到了 self劲腿,就會循環(huán) retain旭绒,self 要釋放才會釋放這個 property,而property作為block有retain了self導致self無法釋放。
__weak MyClass *weakSelf = self;
self.myBlock = ^{
[weakSelf doSomething];
};
哪些事情不要拿Block來做
//遞歸
int (^fibs)(int) = ^(int n){
if (n == 0) {
return 0;
}
if (n == 1) {
return 1;
}
return fibs(n-1) + fibs(n-2);//運行時報錯挥吵,這個block里面重父,fibs這個變量被指向了NULL。
};
NSLog(@"%d",fibs(10));
加上 __block
__block int (^fibs)(int) = ^(int n){
if (n == 0) {
return 0;
}
if (n == 1) {
return 1;
}
return fibs(n-1) + fibs(n-2);//循環(huán)retain忽匈,內(nèi)存泄露
};
NSLog(@"%d",fibs(10));
__block int (^fibss)(int);
int (^fibs_)(int) = ^(int n){
if (n == 0) {
return 0;
}
if (n == 1) {
return 1;
}
return fibss(n-1) + fibss(n-2);
};
fibss = fibs_;
NSLog(@"%d",fibss(10));
delegate 就是將眾多的 callback房午,集中在一個對象上。
callback是指丹允,當我們呼叫了一個function/method時郭厌,可能會花上許多時間,我們不要求馬上得到反饋雕蔽,一段時間后折柠,通過另一個 function/method 傳回來。
當我們需要呼叫大量的method時批狐,在oc里扇售,會直接準備好一個對象,這個對象準備好了所有可以呼叫的method嚣艇,這個對象就叫 delegate承冰,而這些可以呼叫的 method 的集合,叫做 protocal(代理去實現(xiàn)協(xié)議里所用的方法)髓废。我們就不要呼叫那么多的 setAction1:巷懈,setAction2:,只需要 setDelegate:(叫代理去干活)慌洪。
Delegate 屬性應該要用 Weak
Delegate Method 命名方式:method一般以delegate的主人的名字開頭