- Objective-C 可以使用 “委托模式”(Delegate pattern)的編程設(shè)計模式來實現(xiàn)對象間的通信:定義一套接口,某對象若想接受另一個對象的委托向叉,則需遵從此接口样勃,以便成為其 “委托對象”(delegate)吠勘。Objective-C 一般利用 “協(xié)議” 機制來實現(xiàn)此模式。
@class EOCNetworkingFetcher;
struct {
unsigned int didReceiveData : 1;
unsigned int didFailWirhError : 1;
unsigned int didUpdateProgressTo : 1;
} _delegateFlags;
@protocol EOCNetworkingFetcherDelegate <NSObject>
@optional
- (void)newworkingFetcher:(EOCNetworkingFetcher *)fetcher
didRecevieData:(NSData *)data;
@end
@interface EOCNetworkingFetcher : NSObject
@property (nonatomic, weak) id <EOCNetworkingFetcherDelegate> delegate;
@end
- 如果要在委托對象上調(diào)用可選方法峡眶,那么必須提前使用類型信息查詢方法剧防,判斷這個委托對象能否響應(yīng)相關(guān)的選擇子。
if ([self.delegate respondsToSelector:@selector(newworkingFetcher:didRecevieData:)]) {
NSData *data;
[self.delegate newworkingFetcher:self didRecevieData:data];
}
- 每次調(diào)用方法都會判斷一次辫樱,其實除了第一次檢測的結(jié)構(gòu)有用峭拘,后續(xù)的檢測很有可能都是多余的,因為委托對象本身沒變狮暑,不太可能會一下子不響應(yīng)棚唆,一下子響應(yīng)的,所以我們這里可以把這個委托對象能否響應(yīng)某個協(xié)議方法記錄下來心例,以優(yōu)化程序效率宵凌。
- 將方法響應(yīng)能力緩存起來的最佳途徑是使用 “位段”(bitfield)數(shù)據(jù)類型。我們可以把結(jié)構(gòu)體中某個字段所占用的二進制位個數(shù)設(shè)為特定的值止后。
位段瞎惫,C語言允許在一個結(jié)構(gòu)體中以位為單位來指定其成員所占內(nèi)存長度,這種以位為單位的成員稱為“位段”或稱“位域”( bit field) 译株。
struct data {
unsigned int filedA : 8;
unsigned int filedB : 4;
unsigned int filedC : 2;
unsigned int filedD : 1;
}
- filedA 位段占用8個二進制位瓜喇,filedB 位段占用4個二進制位,filedC 位段占用2個二進制位歉糜,filedD位段占用1個二進制位乘寒。filedA 就可以表示0至255之間的值,而filedD 則可以表示0或1這兩個值匪补。
- 我們可以像filedD 這樣子伞辛,創(chuàng)建大小只有1的位段,這樣子就可以把Boolean 值塞入這一小塊數(shù)據(jù)里面夯缺,這里很適合這樣子做蚤氏。
利用位段就可以清楚的表示delegate 對象是否能響應(yīng)協(xié)議中的方法。
struct {
unsigned int didReceiveData : 1;
unsigned int didFailWirhError : 1;
unsigned int didUpdateProgressTo : 1;
} _delegateFlags;
_delegateFlags.didReceiveData = 1;
if (_delegateFlags.didReceiveData) {
// yes
NSData *data;
[self.delegate newworkingFetcher:self didRecevieData:data];
}else {
// no
if ([self.delegate respondsToSelector:@selector(newworkingFetcher:didRecevieData:)]) {
}
}
最后編輯于 :
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者