深入理解Block
- block的
靈活之處
:能夠從函數(shù)外部訪問函數(shù)內(nèi)部的變量
。
-
如果
有返回值
次哈,block的聲明和實現(xiàn)語法略有不同:-
聲明
:
// 返回類型 (^block變量名)(參數(shù)類型); CGFloat (^myBlock)(NSObject *);
-
實現(xiàn)
:
// ^返回類型(參數(shù)類型 參數(shù)名) ^CGFloat(NSObject *obj) { /** 實現(xiàn)block */ };
-
做參數(shù)
:
// (返回類型 (^)(參數(shù)類型))block變量名; (CGFloat (^)(NSObject *))myBlock;
-
- 利用block實現(xiàn)
回調(diào)方法
鲸沮,作為屬性的block會被保存
到堆诺凡,等待
被調(diào)用時執(zhí)行沸柔。
- block的
typedef
格式同其他類型不同:
/**
typedef 原始類型 新類型
*/
typedef int intType;
/**
typedef 返回類型 (^block類型名)(參數(shù)類型)
*/
typedef CGFloat(^myBlock)(NSString *str);
- 直接設(shè)置對象的
block屬性
暑刃,編譯器不提示block類型
勤讽。解決方法:- 利用
typedef
定義所需的block類型竹宋。 - 將block屬性劃為
私有
。 - 提供一個setBlock方法地技,用來
設(shè)置
block屬性蜈七。
- 利用
/**
1. 定義block類型(.h)
*/
typedef void(^RAPWebImageDownloadHandler)(RAPWebImageDownloadOperation *op);
/**
2. 提供一個設(shè)置block屬性的方法(.h)
*/
- (void)setWebImageDownloadHandler:(RAPWebImageDownloadHandler)handler;
/**
3. 將block屬性劃為私有(.m)
*/
@property (nonatomic, copy) RAPWebImageDownloadHandler handler;
// 4. 方法實現(xiàn)(.m)
- (void)setWebImageDownloadHandler:(RAPWebImageDownloadHandler)handler
{
self.handler = handler;
}
- 在 block 中使用 self 前,要先判斷是否為空莫矗,如果為空飒硅,則返回,否則作谚,繼續(xù)執(zhí)行后續(xù)邏輯三娩;盡管在 OC 中,向 nil 發(fā)消息沒問題妹懒,但是雀监,如果后續(xù)邏輯包含數(shù)據(jù)操作,那么就會出現(xiàn)界面未改變眨唬,但數(shù)據(jù)已經(jīng)發(fā)生變化的情況
// 弱引用 self
__weak __typeof(&*self)weakSelf = self;
[DDPhpClient request:@"http://www.baidu.com" params:nil completion:^(NSError *err, id returnData) {
if (self == nil) return;
// 其它業(yè)務(wù)邏輯
UIViewController *vc = [UIViewController new];
[self presentViewController:vc animated:YES completion:nil];
}];