- Effective Objective-C 2.0 读书笔记
- Effective Objective-C 2.0笔记(二)
- Effective Objective-C 2.0笔记(一)
- Effective Objective-C 2.0笔记(三)
- Effective Objective-C 2.0笔记(五)
- 《Effective Objective-C 2.0 》 阅读笔
- Effective Objective-C 2.0 无废话精简篇
- Effective Objective-C 2.0 脑图- [O
- iOS开发读书笔记:Effective Objective-C
- iOS开发读书笔记:Effective Objective-C
第四章 协议与分类
第二十三条:通过委托与数据源协议进行对象间通信
-
委托模式为对象提供了一套接口,使其可由此将相关事件告知其他对象。
-
将委托对象应该支持的接口定义成协议,在协议中把可能需要处理的事件定义成方法。
-
当某对象需要从另一个对象中获取数据时,可以使用委托模式。又称“数据源协议”。
-
若有必要,可实现含有“位段”的结构体,将委托对象是否能相应的相关协议方法缓存其中。
- (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就是“匿名的对象”
网友评论