#import ViewController.h
/*
使用Block最大的一個好處就是可以在代碼塊中隨時訪問外部變量
比如你在A.class類中的某個方法中聲明了一段代碼塊.你可以在代碼塊中直接對A.class所擁有的成員變量進行調用,並且,通過一定的條件(__block),還可以隨時的修改這些變量的值和指針
釋放某個不再需要使用的Block成員變量,只需要將其設置nil即可
為局部變量加上__block修飾,可以改變局部變量的值
在Block裡面可以隨時訪問全局變量,靜態變量等,並對它們的值和指針進行修改.
但在Block中直接使用所在聲明區域的類的成員變量和self時也是可以直接使用和修改的,但需要注意循環引用.
*/
typedef BOOL (^block2)(void);
@interface ViewController ()
@property (strong, nonatomic) IBOutlet UIButton *block1;
- (IBAction)touchBlock1:(id)sender;
- (IBAction)touchBlock2:(id)sender;
- (IBAction)touchBlock3:(id)sender;
@property (nonatomic,copy) NSString *str2;
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
}
- (void)didReceiveMemoryWarning {
[super didReceiveMemoryWarning];
}
#pragma mark -block用法1
- (IBAction)touchBlock1:(id)sender {
// void是代碼塊的返回值,int是代碼塊的參數
void (^MyBlock1)(int i)=^(int i){
NSLog(@block===1====%d,i);
};
//給block代碼塊傳入int類型的參數10
MyBlock1(10);
}
#pragma mark -block用法2 在Block裡面可以隨時訪問全局變量,靜態變量等,並對它們的值和指針進行修改.
- (IBAction)touchBlock2:(id)sender {
/*
首先,在block之前定義對self的一個弱引用wSelf,因為是弱引用,所以當self被釋放時wSlelf會變為nil,然後在block中引用該弱引用,考慮到多線程情況,通過使用強引用sself來引用該弱引用,這時如果 self 不為 nil 就會 retain self,以防止在後面的使用過程中 self 被釋放;然後在之後的 block 塊中使用該強引用 sself,注意在使用前要對 sself 進行了 nil 檢測,因為多線程環境下在用弱引用 wself 對強引用 sself 賦值時,弱引用 wself 可能已經為 nil 了。
通過這種手法,block 就不會持有 self 的引用,從而打破了循環引用。
*/
//防止循環引用
__weak ViewController *wSelf = self;
//__weak typeof(self) weakSelf = self;
void (^changeValue)(NSString *)=^(NSString *str){
wSelf.str2=str;
ViewController * sself = wSelf;
if (sself) {
NSLog(@%@, sself);
}else {
NSLog(@
}
};
//給block代碼塊傳入參數
changeValue(@block2);
NSLog(@self.str2:%@,self.str2);
}