您的位置:首页 > 移动开发 > IOS开发

编写高质量iOS与OS X代码的52个有效的方法 之协议与分类

2015-12-13 20:49 519 查看
1.通过委托与数据源协议进行对象间通信
委托模式:(Delegate patten) ,该模式的主旨是:定义一套接口,某对象若想接受另一个对象的委托,则需遵从此接口,以便成为其”委托对象(delegate)”
为了指明可选方法,委托协议经常使用@optional 关键字来标注其大部分或全部的方法;
如果是委托对象的可选方法,
NSData *data = /*data obtained from network */
if ([_delegate respondsToSelector : @selector (newworkFetcher:didReceiveDate:)])
{
  [_delegate networkFetcher:self didReceiveData:data];
}

这样设置delegate对象就可以完全按照其需要来实现委托协议的方法了,不用担心因为那个方法没有实现而到时程序出问题,
若有必要,可实现含有位段的结构体,将委托对象是否能响应相关协议方法这一信息缓存至其中;(代码的优化)

2.将类的实现代码分散到便于管理的数个分类之中
使用分类机制把类的实现代码分层易于管理的小块

#import <Foundation/Foundation.h>

@interface EOCPerson : NSObject

@property (nonatomic,copy,readonly) NSString *firstName;

@property (nonatomic,copy,readonly) NSString *lastName;

@property (nonatomic,copy,readonly) NSString *friends;

- (id )initWithFirstName : (NSString *)firstName

             andLastName :(NSString *)lastName;

@end

@interface EOCPerson (Friendship)

- (void)addFriend :(EOCPerson *)person;

- (void)removeFriend :(EOCPerson *)person;

- (void)lisFriendsWith : (EOCPerson *)person;

@end

@interface EOCPerson (Work )

- (void)persormDayWork;

- (void)takeVacationFromWork;

@end

@interface EOCPerson (Play)

- (void)goToTheCinema;

- (void)gotoSportsGame;

@end

3.向第三方类中添加分类时,总应给其名称加上你专用的前缀

@interface NSString (ABC_HTTP)

//Encode a string with URL encoding

- (NSString *)abc_urlEncodedString;

//Edcode a URL encoded string

- (NSString *)abc_urlDecodedString;

@end

4.不要再分类中声明属性

分类时复发合成与属性相关的实例变量的所以开发者需要在分类中为该实现存取方法;

5.使用"class-continuation 分类" 隐藏实现细节

如果有方法和实例变量,可以在class-continuation 分类中定义
@interface EOCPerson ()
//Meghods here 
@end
定义在这个类中可以将其隐藏起来,只供本类使用,即便在公共接口里将其标注为private,也还是会泄露实现细节,比方说你有个绝密的类,不想让人知道,就可以这样做

6通过协议提供匿名对象

协议在某种程度上提供匿名类型.具体的对象类型可以淡化成遵从莫协议的id,类型,协议里规定了对象所对应实现的方法;

@protocol EOCDatabaseConnection <NSObject>

- (void)connect;

- (void)disconnect;

- (void)isConnected;

- (NSArray *)performQuery : (NSArray *)query;

@end

@protocol EOCDatabaseConnection ;

@interface eocDatebaseManager  :
NSObject

+ (id)sharedInstance;

- (id)<EOCDatabaseConnection>connectionWithIdentifier: (NSString *)identifier;

@end

这样的话,处理数据库连接所用的类的名称就不会泄露了,有可能来自不同框架的那些类型在均可由同一个方法来返回了.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: