你好,歡迎來到IOS教程網

 Ios教程網 >> IOS編程開發 >> IOS開發綜合 >> iOS Block使用

iOS Block使用

編輯:IOS開發綜合

 

#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(@ dealloc before we could run this code.);
}
};
//給block代碼塊傳入參數
changeValue(@block2);
NSLog(@self.str2:%@,self.str2);
}

 

  1. 上一頁:
  2. 下一頁:
蘋果刷機越獄教程| IOS教程問題解答| IOS技巧綜合| IOS7技巧| IOS8教程
Copyright © Ios教程網 All Rights Reserved