模拟Target-Action方式,Selector实现方法

319 阅读1分钟

在组件设计中,往往会出现需要组件去响应其他组件的场景,常用的方式有Block,Delegate,NSNotification等等。 下面我要介绍的是比较冷门的一个方法,TargetAction的方法。 方法灵感来源于UIButton的addTarget:方法。

如果我们能为自己的控件绑定好响应操作的方法,代码相较于Block块状分布会优雅的多。

首先

在控件.h文件里添加好暴露出去的方法。 并且定义两个属性,分别是SEL方法选择器和target

@property (nonatomic,weak) id target;
@property (nonatomic,assign) SEL seclector;

- (void) addTarget:(id)target
         selector:(SEL)selector;

实现

然后在相应的.m文件里实现

- (void) tapAction{
    
    if (_target && [_target respondsToSelector:_seclector]) {
       
        if (!_target) {
            return;
        }
        IMP imp = [_target methodForSelector:_seclector];
        void (*func)(id,SEL,HotPointPiecesView *) = (void *)imp; //HotPointPiecesView是我创建的类,我将当前类传递出去
        func(_target,_seclector,self);

    }
}
- (void)addTarget:(id)target selector:(SEL)selector{
    if (target && selector) {
        self.target = tagret;
        self.seclector = selector;
    }
}

其中- (void) tapAction方法,是手势响应方法,由于当前类是个UIView,我添加了一个手势来响应触摸操作。

其中的坑

一开始我的- (void) tapAction是这么实现的:

- (void) tapAction{
    
    if (_target && [_target respondsToSelector:_seclector]) {
       
        if (!_target) {
            return;
        }
        [_target performSelector:_seclector withObject:self];
    }
}

紧接着Xcode报了一个警告: "performSelector may cause a leak because its selector is unknown". 字面上的意思是performSelector方法会导致一个leak,因为selector是未知的。

解决的方法:
http://stackoverflow.com/questions/7017281/performselector-may-cause-a-leak-because-its-selector-is-unknown