美文网首页
Effective Objective-C 2.0读书笔记(4)

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

作者: _桃夭大人_ | 来源:发表于2019-02-12 14:38 被阅读0次

第四章 协议与分类

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

  • 委托模式为对象提供了一套接口,使其可由此将相关事件告知其他对象。

  • 将委托对象应该支持的接口定义成协议,在协议中把可能需要处理的事件定义成方法。

  • 当某对象需要从另一个对象中获取数据时,可以使用委托模式。又称“数据源协议”。

  • 若有必要,可实现含有“位段”的结构体,将委托对象是否能相应的相关协议方法缓存其中。

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

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

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

  • 使用分类机制把类的实现代码划分成 易于管理的小块。
  • 将应该视为“私有”的方法归入名叫Private的分类中,以隐藏实现细节。

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

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

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

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

#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”分类隐藏实现细节

  • "class_continuation 分类"和普通的分类不同, 它必须定义在 其所接续的那个类的实现文件里。
    这是唯一能声明实例变量的分类。
  • 如果某属性在主接口中声明为“只读”,而类的内部又要用设置方法修改此属性,那么就在“class-continuation分类”中将其扩展为“可读可写”。


    image.png
  • 把私有方法的原型声明在“class-continuation分类”里面。

  • 若想使类 所遵循的协议不为人所知,则可于“class-continuation分类”中声明。

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

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

相关文章

网友评论

      本文标题:Effective Objective-C 2.0读书笔记(4)

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