屬性
block是一個(gè)函數(shù)對(duì)象并闲,在程序運(yùn)行中生成细睡。在運(yùn)行時(shí),block創(chuàng)建在棧(stack)上帝火,和其他分配在棧上的對(duì)象一樣溜徙,離開就不存在了。所以block作為對(duì)象屬性時(shí)犀填,需要聲明為copy蠢壹。
@property (nonatomic, copy) void(^block)();
__weak
在block內(nèi)部,引用block持有者時(shí)需要用__weak來(lái)修飾九巡,為了防止循環(huán)引用图贸。
一般__weak和__strong是成對(duì)出現(xiàn)的,為了保證在block內(nèi)執(zhí)行的時(shí)候冕广,如果weak的對(duì)象被釋放了但在block內(nèi)不會(huì)立即釋放疏日,保證能順利執(zhí)行完block內(nèi)的代碼。
__weak typeof(self) wself = self;
void(^testBlock)() = ^(){
__strong typeof(wself) sself = wself;
};
這里wself在block內(nèi)外指向同一對(duì)象但內(nèi)存地址不同撒汉,因?yàn)閎lock在捕獲了wself時(shí)同對(duì)它進(jìn)行拷貝沟优。
__block
在block內(nèi)需要修改某些對(duì)象時(shí),需要標(biāo)記為__block睬辐。
因?yàn)闆](méi)有__block標(biāo)記的變量挠阁,其值會(huì)被復(fù)制一份到block私有內(nèi)存區(qū);有__block標(biāo)記的變量,其地址會(huì)被記錄在block私有內(nèi)存區(qū).
所以沒(méi)用__block修飾的變量在block外值改變了溉委,再執(zhí)行block時(shí)內(nèi)部該變量的值不會(huì)變化鹃唯。
聲明
習(xí)慣用type聲明block,但有的時(shí)候?yàn)榱私怦钸€是直接寫來(lái)得方便瓣喊。舉幾個(gè)各種場(chǎng)景的例子:
- (NSString *)testA:(NSString * (^)(NSString *s))block {
NSString * (^blockA)(NSString *) = ^(NSString *paramA){
NSLog(@"%@",paramA);
return paramA;
};
blockA(@"blockA");
return block(@"test");
}
- (void)testB:(void (^)(void))block {
void (^blockB)(void) = ^{NSLog(@"B");};
blockB();
return block();
}