天天看點

iOS開發--Block的使用

1:Block為匿名函數 能夠實作函數回調功能

可以用于界面之間的通信 同時可以進行傳值

2:注意:定義Block必須使用copy修飾 retain和assign會照成野指針問題

3:不使用block時候需要銷毀

-(void)dealloc{
    //釋放block
    Block_release(_passValueBlock);
    [super dealloc];
}
           

4:在block實作部分 不能直接使用執行個體變量,self調用屬性,因為block會造成self引用計數加1,最終導緻循環引用問題..

*傳值(從second傳到first)

block傳值了類似代理傳值

定義FirstView(根視圖控制器)和ScondView

“SecondView.h”檔案

#import <UIKit/UIKit.h>

typedef void(^PassValueBlock)(NSString *);

@interface SecondView : UIViewController

@property (nonatomic,retain)UITextField *textFild;

//1: 聲明屬性 在第一個界面去接收block文法塊 
@property (nonatomic,copy)PassValueBlock passValueBlock;
@end

 "SecondView.m"檔案
//視圖将要消失的适時候
-(void)viewDidDisappear:(BOOL)animated{
    [super viewDidDisappear:animated];
    //2 ; 調用block 傳入參數
    self.passValueBlock(_textFild.text);
}

"FirstView.m"檔案
-(void)nextAction:(UIBarButtonItem *)Bt{
    SecondView *seconVC = [[SecondView alloc]init];
    [self.navigationController pushViewController:seconVC animated:YES];
    [seconVC release];
    //使用屬性接收block文法塊
    __block FirstView *firstVC = self;
    seconVC.passValueBlock = ^ void (NSString *string){
        //将傳入的參數 給空間指派
        //不用self 用firstVC
        //原因: 對應block内部在使用外部對象的時候 會對該對象持有一份所有權
        //如果不想持有 使用__block修飾該對象
        //在ARC情況下 使用__weak
        firstVC.textFild.text = string;
    };
}
           

繼續閱讀