编写高质量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
这样的话,处理数据库连接所用的类的名称就不会泄露了,有可能来自不同框架的那些类型在均可由同一个方法来返回了.
委托模式:(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
这样的话,处理数据库连接所用的类的名称就不会泄露了,有可能来自不同框架的那些类型在均可由同一个方法来返回了.
相关文章推荐
- 深拷贝和浅拷贝
- iOS中OpenGL应用
- IOS内存管理3&之保留环&弱引用&属性保存
- iOS内存管理2&之调试内存错误
- iOS 点击空白处收回键盘的方法
- iOS开发——Xcode好用的插件(16年12月更新)
- iOS开发——图片选取
- iOS设计模式--单例
- IOS开发之选择系统音乐
- iOS环信3.0集成 (三)单聊集成
- iOS常用加密方法(aes、md5、base64)
- IOS开发音频播放之AVaudioplayer
- 需求 - 14 - "ShouldWillDid" - 1
- 需求 - 13 - “左右中”
- iOS 应用程序的发布(和测试)证书 ,描述证书 的生成和 上线流程
- ios内存管理&1之常见的内存管理
- iOS编译ffmpeg
- IOS RSA加密
- IOS安装FFmpeg调用成功总结的一些问题
- iOS 通知传值