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;
};
}