Effective Objective-C 2.0读书笔记(4)

2019-02-12  本文已影响0人  _桃夭大人_

第四章 协议与分类

第二十三条:通过委托与数据源协议进行对象间通信

- (void)setDelegate:(id<EOCNetworkFetcher>)delegate{
    _delegate = delegate;
    _delegateFlags.didReceiveData = [delegate respondsToSelector:@selector(networkFetcher:didReceiveData:)];
}

if(_delegateFlages.didReceiveData){
    [_delegate networkFetcher:self didReceiveData:nil];
}

第二十四条:将类的实现代码分散到便于管理的数个分类中

第二十五条 :总是为第三方的分类名称加前缀

分类中的方法 会覆盖主类中的方法实现。
解决方法:以命名空间来区别各个分类的名称与其中所定义的方法。即 添加前缀

第二十六条:勿在分类中声明属性

把所有属性定义在主接口里。
利用关联对象实现在分类中添加属性,可行但不理想

#import <objc/runtime.h>
static const char * kFeriendsPropertyKey = "kFeriendsPropertyKey";
@implementation EOCPerson(Friendship)
- (NSArray *)friends{
    return objc_getAssociatedObject(self, kFeriendsPropertyKey);
}

- (void)setFriends:(NSArray *)friends{
    objc_setAssociatedObject(self, kFeriendsPropertyKey,friends,OBJC_ASSOCIATION_RETAIN_NONATOMIC);
}
@end

第二十七条 使用“class-continuation”分类隐藏实现细节

第二十八条:通过协议提供 匿名对象

@property (nonatomic,weak)id <EOCDelegate> delegate;
 该属性的类型是 id<EOCDelegate> 任何类的对象都能充当这一属性,
即便该类不继承NSObject,只要遵循EOCDelegate。
对于具备此属性的类来说,delegate就是“匿名的对象”
上一篇下一篇

猜你喜欢

热点阅读