Effective Objective-C 2.0 阅读笔记<二>

第三章 接口与API设计

1.Objective-C没有命名空间,所以在命名上最好加上前缀以减小冲突的可能,前缀建议采用三个字母(苹果保留使用所有两个字母前缀的权利)。在开发自己的类库时如果用了其他第三方类库,最好将第三方类库也加上前缀,这样可以让使用者使用你的类库的同时也用你的类库中用到第三方类库(有点绕. . .)。

2.覆写description方法,打印出一些有用信息帮助调试。

3.封装一个对象时,对外公开属性最好是只读(readonly)的,如果要在内部修改可在对象内部重新声明为readwrite。这种模式在AFNetworking有着大量的应用。

4.私有方法最好加上前缀(p ),前缀不要只用一个下划线( ),这种做法是苹果预留的。

5.容器类对象默认执行的是浅拷贝,若要执行深拷贝需要自己编写相关方法。

第四章 协议与分类

1.委托属性常用weak来修饰;一个协议里的方法是optional的,需要先判断委托对象是否实现改方法,如果经常需要判断则可考虑做个缓存。

2.weakunsafe_unretain的区别是前者在相关对象销毁时需要自动清空,后者则不需要。

3.分类中不要添加属性,必须添加的话可以采用关联对象机制模拟,不推荐。分类的设计初衷是扩展类的功能,而属性是用于数据的封装,因此,属性最好定义在主接口中。

4.class-continuation分类(在其他地方看到过叫匿名分类),这本书多次提到了这个概念,对应的部分是:

//SonClass.h
@interface SonClass : FatherClass
@end

//SonClass.m
@interface SonClass()
{
//class-continuation分类
}
@end

5.class-continuation分类可以用来隐藏实现细节,如系统的WebKit其实大部分是C++编写的,但是对外展示的却是一套整洁的Objective-C接口。

6.匿名对象,常见的有:

@property (nonatomic, weak) id<MyDelegate> delegate;

这句话的意思是delegate遵循MyDelegate协议,至于它本身是什么类不关心。匿名分类也可以用来对一些第三方类库进行一些简单封装:

@protocol MyDatabaseConnection
-(void)connect;
-(void)disconnect;
-(BOOL)isConnected;
-(NSArray *)performQuery:(NSString*)query;
@end

//使用
@ protocol MyDatabaseConnection;

@interface MyDatabaseManager : NSObject
+sharedInstance;
-(id<MyDatabaseConnection>)connectionWithIdentifier:(NSString*)identifier;
@end

这里隐藏了数据库连接所用的类(可能来自不同框架),而且在后续中,无需改变公共API,就能切换后端实现类。

6.关于匿名分类的一个面试题:

idid<NSObject>、NSObject的区别

NSObject:就是用来定义NSObject对象的。
id:它就是一个指针,它可以指向的类型不仅限于NSObject,如NSProxy
id<NSObject>:它指向的对象要求实现NSObject所实现的协议,所以说它可以定义NSObjectNSProxy(它也实现了<NSObject>)或者其他实现了<NSObject>的对象。