用block代替@selector

一般給按鈕添加事件是這樣的組合:

// 把點擊后要調(diào)用的方法名傳到@selector中
self.btn addTarget:self action:@selector(btnClick) forControlEvents:UIControlEventTouchUpInside];
// 找別的地方寫上方法的實現(xiàn)
- (void)btnClick {
}

這樣寫代碼多不說,工程大的話還得到處找方法。
所以我寫了一個分類,可以用block來代替@selector(),防止代碼分散。

使用起來是這樣的:

// button
[self.btn addTarget:self action:[self selectorBlock:^(id arg) {
    NSLog(@"clicked %@", arg);
}] forControlEvents:UIControlEventTouchUpInside];

下面講一下分類NSObject+BlockSEL.h中的實現(xiàn)原理

- (SEL)selectorBlock:(void (^)(id))block {
    NSString *selName = [NSString stringWithFormat:@"selector_%p:", block];
    SEL sel = NSSelectorFromString(selName);
    class_addMethod([self class], sel, (IMP)selectorImp, "v@:@");
    objc_setAssociatedObject(self, sel, block, OBJC_ASSOCIATION_COPY_NONATOMIC);
    return sel;
}

static void selectorImp(id self, SEL _cmd, id arg) {
    void (^block)(id arg) = objc_getAssociatedObject(self, _cmd);
    if (block) block(arg);
}

block的內(nèi)存地址創(chuàng)建一個唯一方法,并將方法實現(xiàn)綁定到selectorImp函數(shù)。將block用關(guān)聯(lián)對象保存下來,在調(diào)用時執(zhí)行block。

需要注意一下,當block中使用self時會產(chǎn)生循環(huán)引用,需要用__weak來修飾防止self無法釋放。

__weak typeof(self) weakSelf = self;
[self.btn addTarget:self action:[self selectorBlock:^(id arg) {
    weakSelf.view.backgroundColor = [UIColor whiteColor];
}] forControlEvents:UIControlEventTouchUpInside];

demo下載地址

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 轉(zhuǎn)至元數(shù)據(jù)結(jié)尾創(chuàng)建: 董瀟偉,最新修改于: 十二月 23, 2016 轉(zhuǎn)至元數(shù)據(jù)起始第一章:isa和Class一....
    40c0490e5268閱讀 2,097評論 0 9
  • 禪與 Objective-C 編程藝術(shù) (Zen and the Art of the Objective-C C...
    GrayLand閱讀 1,823評論 1 10
  • 設(shè)計模式是什么? 你知道哪些設(shè)計模式,并簡要敘述? 設(shè)計模式是一種編碼經(jīng)驗,就是用比較成熟的邏輯去處理某一種類型的...
    琦均煞Sylar閱讀 525評論 0 0
  • 石海Hi閱讀 706評論 23 22
  • 今天沒有寫小說的思路了,那就來談?wù)劇靶芎⒆印钡脑掝}吧。 前一段時間,在網(wǎng)上看到一個段子,說是一個哥們的朋友帶著孩子...
    魔豆Magicbean閱讀 673評論 0 1

友情鏈接更多精彩內(nèi)容