使用 Block
另一個(gè)選擇是使用 block雕什。再一次用餅狀圖舉例,代碼看起來大概是這樣:
@interface PieChart : UIControl
@property (nonatomic,copy) void(^selectionHandler)(PieChartSection* selectedSection);
@end
在選取行為的代碼中显晶,你只需要執(zhí)行它贷岸。在此之前檢查一下block是否被賦值非常重要,因?yàn)閳?zhí)行一個(gè)未被賦值的 block 會(huì)使程序崩潰磷雇。
if (self.selectionHandler != NULL) {
self.selectionHandler(self.selectedSection);
}
這種方法的好處是可以把相關(guān)的代碼整合在視圖控制器中:
- (void)setupPieChart
{
self.pieChart.selectionHandler = ^(PieChartSection* section) {
// 處理區(qū)塊
}
}
就像代理偿警,每個(gè)動(dòng)作通常只有一個(gè) block。另一個(gè)重要的限制是不要形成引用循環(huán)唯笙。如果你的視圖控制器持有餅狀圖的強(qiáng)引用螟蒸,餅狀圖持有 block,block 又持有視圖控制器睁本,就形成了一個(gè)引用循環(huán)尿庐。只要在 block 中引用 self 就會(huì)造成這個(gè)錯(cuò)誤忠怖。所以通常代碼會(huì)寫成這個(gè)樣子:
__weak id weakSelf = self;
self.pieChart.selectionHandler = ^(PieChartSection* section) {
MyViewController* strongSelf = weakSelf;
[strongSelf handleSectionChange:section];
}
一旦 block 中的代碼要失去控制 (比如 block 中要處理的事情太多呢堰,導(dǎo)致 block 中的代碼過多),你還應(yīng)該將它們抽離成獨(dú)立的方法凡泣,這種情況的話可能用代理會(huì)更好一些枉疼。
摘自:自定義控件