iOS Block使用

來源:互聯網
上載者:User

標籤:ios   block   


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

著作權聲明:本文為博主原創文章,未經博主允許不得轉載。

iOS Block使用

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.