[iOS][OC] 复写 delegate accessors

2018-11-08  本文已影响21人  BudSwift

委托模式是 iOS 开发常用的设计模式,在实现当中必要时可以做一些小优化:

- (void)setDelegate:(id<SomeProtocol>delegate {
    _delegate = delegate;
    // do something if needed.
}
- (BOOL)delegate_respondsToSelector:(SEL)selector {
    return self.delegate && [self.delegate respondsToSelector:selector];
}
- (void)dzn_willDisappear
{
    if (self.emptyDataSetDelegate && [self.emptyDataSetDelegate respondsToSelector:@selector(emptyDataSetWillDisappear:)]) {
        [self.emptyDataSetDelegate emptyDataSetWillDisappear:self];
    }
}
- (void)setEmptyDataSetSource:(id<DZNEmptyDataSetSource>)datasource {
    ....
        objc_setAssociatedObject(self,
                             kEmptyDataSetSource,
                             [[DZNWeakObjectContainer alloc] initWithWeakObject:datasource],
                             OBJC_ASSOCIATION_RETAIN_NONATOMIC);
     ....
}

@interface DZNWeakObjectContainer : NSObject

@property (nonatomic, readonly, weak) id weakObject;

- (instancetype)initWithWeakObject:(id)object;

@end

@implementation DZNWeakObjectContainer

- (instancetype)initWithWeakObject:(id)object
{
    self = [super init];
    if (self) {
        _weakObject = object;
    }
    return self;
}

@end

对应的调整 getter 方法:

- (id<DZNEmptyDataSetDelegate>)emptyDataSetDelegate
{
    DZNWeakObjectContainer *container = objc_getAssociatedObject(self, kEmptyDataSetDelegate);
    return container.weakObject;
}

如果同时复写了 setter/getter,那么就意味着不需要自动合成属性变量,需要手动合成。

@synthesize delegate = _delegate;

参考:

加我微信沟通。


上一篇 下一篇

猜你喜欢

热点阅读