在MRC環境下: this
block對局部變量的影響:spa
使用局部變量:a到block塊中,爲了在block中可以使用這個變量,將a拷貝放到常量區 域 code
int a = 10; orm
若是訪問局部對象,爲了在block中可以使用這個對象,引用計數值加一對象
若是使用__block修飾,計數值則不加一it
__block NSMutableArray *array = [[NSMutableArray alloc]initWithObjects:@"張三",@"李四",@"王五", nil]; //1 [button addTapBlcok:^(UIButton *button){ // a = 90; NSString *str = [array objectAtIndex:2]; NSLog(@"str:%@",str); }]; [array release];
block對全局變量的影響table
block在訪問全局變量、方法的時候,會將這個變量對應的對象計數值加一class
block -> self -> self.view -> button -> block test
解決方式:使用__block修飾self 變量
總結:在MRC環境中__block的做用:(1)能夠在block中修改變量值 (2)block內部訪問屬性的時候,能夠使用__block修飾,避免計數值加一(解決循環引用問題)
MyButton *button = [MyButton buttonWithType:UIButtonTypeCustom]; button.frame = CGRectMake(90, 90, 90, 90); button.backgroundColor = [UIColor redColor]; [self.view addSubview:button]; __block SecondViewController *this = self; [button addTapBlcok:^(UIButton *button){ // this->_index = 20; // NSLog(@"%ld",this->_index); [this test]; }]; } - (void)test { NSLog(@"test"); }
在ARC環境下:
__block:(1)可讓局部變量在block中修改數據
//在ARC環境中 //__block:(1)可讓局部變量在block中修改數據 __block int a = 9; [button addTapBlcok:^(UIButton *button){ a = 2; NSLog(@"a:%d",a); }];
解決循環引用問題
使用__weak修飾self
//在ARC環境中的解決方法: // strong weak __weak SecondViewController *weakThis = self; [button addTapBlcok:^(UIButton *button){ //在調用方法的時候,解決了循環引用問題 // [weakThis test]; //weakThis沒法訪問當前的屬性 __strong SecondViewController *strongThis = weakThis; strongThis->_index = 20; NSLog(@"%ld",strongThis->_index); [strongThis test]; }]; } - (void)test { NSLog(@"test"); }