標籤:java 使用 os io cti 代碼 ar c++
Block 相當於C或C++中的函數指標,相當於.NET或Java中的delegate
//Block聲明
double (^blockName) (double, double) =
^ double (double firstParam, double secondParam){
return firstParam * secondParam;
}
//Block調用
double result = blockName(2,4);
block 會形成一個閉包
- (void) testMethod{
int i = 42;
void (^testBlock) (void) = ^{
NSLog(@"%i", i);
};
i = 84;
testBlock();
}
這段代碼中block i 的值42被testBlock capture了,即使在testBlock被調用之前修改i的值,testBlock的執行結果依然輸出42. 而且在testBlock中即使修改 i 的值,也不會影響到原始的 i 的值。
可以使用 __block關鍵字,讓在block外定義的變數能夠被block內部的代碼共用
__block int i = 42;
void (^testBlock) (void) = ^ {
NSLog(@"%i", i);
i = 100;
}
testBlock();
NSLog(@"%i", i);
這種情況下,輸出結果為 42,100
block通常做為參數傳遞給方法,作為回呼函數。block類型的參數一般放在方法參數列表的最後面
- (void) testMethod: (NSString *)str callback: (void(^) (void)) testBlock;
用typedef簡化block文法
typedef void (^NothinBlock) (void);
這樣就可以建立NothinBlock的執行個體,用來建立具有相同簽名的block
NothinBlock callback = ^{
...
};
如果在一個class中定義一個block類型的屬性,而這個block中capture了self的時候,可能會造成強引用迴圈
@interface Nothin : NSObject
@property (copy) void (^block) (void);
@end
@implementation Nothin
- (void) configureBlock{
self.block = ^{
[self doSomething];
}
}
@end
因為self對block是強引用,而block中又capture了self,這個時候就造成強引用迴圈。為避免這種情況,需要在block中對self弱引用
- (void) configureBlock{
Nothin * __weak weakSelf = self;
self.block = ^{
[weakSelf doSomething];
}
}
這種情況下,當block執行完,對self的引用就解除了