用block代替@selector

作者: HJaycee | 来源:发表于2017-04-28 14:52 被阅读302次

一般给按钮添加事件是这样的组合:

// 把点击后要调用的方法名传到@selector中
self.btn addTarget:self action:@selector(btnClick) forControlEvents:UIControlEventTouchUpInside];
// 找别的地方写上方法的实现
- (void)btnClick {
}

这样写代码多不说,工程大的话还得到处找方法。
所以我写了一个分类,可以用block来代替@selector(),防止代码分散。

使用起来是这样的:

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

下面讲一下分类NSObject+BlockSEL.h中的实现原理

- (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的内存地址创建一个唯一方法,并将方法实现绑定到selectorImp函数。将block用关联对象保存下来,在调用时执行block

需要注意一下,当block中使用self时会产生循环引用,需要用__weak来修饰防止self无法释放。

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

demo下载地址

相关文章

  • 用block代替@selector

    一般给按钮添加事件是这样的组合: 这样写代码多不说,工程大的话还得到处找方法。所以我写了一个分类,可以用block...

  • Swift项目中使用Runtime

    背景介绍 学习Swift的时候写工具类的时候突发奇想,想要使用block代替selector,尝试了很多次,最后还...

  • iOS内存泄露可能出现的问题和解决工具

    内存防止 1、Block,使用_weak声明一个代替self的新变量代替原先的self 自定义的block用cop...

  • 个性化 UIAlertController

    系统的 UIAlertController 封装的很漂亮,用block代替之前 UIAlertView 的代理,用...

  • 《iOS进阶》-GCD使用

    GCD的使用 block的定义 block 有点像函数指针,只不过用"^"代替了""* 申明变量:(void)(^...

  • iOS通知使用总结

    NSNotification 一、添加通知 1.使用selector添加 2.使用block添加 使用block添...

  • iOS Block使用

    定义 简单block的定义类似函数指针,差别在于用^ 代替函数指针的* 例: 大多数情况,我们定义的block都是...

  • Block

    关于Block语法 通过target+selector模式进行方法的传递 通过Block模式进行方法的传递 Cat...

  • netty:SelectedSelectionKeySet介绍

    介绍 SelectedSelectionKeySet用来代替Selector的selectedKeys成员和pub...

  • Aspect -- 纯Swift写的AOP库

    主要难点是Swift中拿到Selector以及Block的NSInvocation和NSMethodSignatu...

网友评论

    本文标题:用block代替@selector

    本文链接:https://www.haomeiwen.com/subject/ttzozttx.html