還是要好好學習英文啊搬俊,筆者只能看中文版的,下載地址如下:
http://download.csdn.net/detail/m6830098/7977521
看書的時候還是困的不行不行的膝捞,今天不看書都困-
今天來學習學習本書的第四章馆类。
第一條:通過委托與數(shù)據(jù)源協(xié)議進行對象之間的通信。"委托模式(Delegate pattern)"的編程設計模式來實現(xiàn)對象間的通信, 該模式的主旨是:定義一套接口牵咙,某對象若是想接受另一個對象的委托,則需遵從此接口攀唯。以便成為其"委托對象(delegate)"洁桌。此模式可以將數(shù)據(jù)與業(yè)務邏輯解耦。視圖對象的屬性中侯嘀,可以包含負責數(shù)據(jù)與事件處理的對象另凌,這兩種對象分別稱為"數(shù)據(jù)源(data source)"和"委托(delegate)"。
#import <Foundation/Foundation.h>
@class WWNetworkFetcher;
@protocol WWNetworkFetcherDelegate <NSObject>
@optional //可選方法
- (void)networkFetcher:(WWNetworkFetcher *)fetcher didReceiveData:(NSData *)data;
- (void)networkFetcher:(WWNetworkFetcher *)fetcher didFailWithError:(NSError *)error;
@end
@interface WWDataModel : NSObject
@property (nonatomic, weak) id <WWNetworkFetcherDelegate> delegate;
@end
注意:這個屬性需定義成weak戒幔,而非strong吠谢,因為兩者之間必須為"非擁有關系"。
實現(xiàn)委托對象的辦法是聲明某個類遵從委托協(xié)議诗茎,然后把協(xié)議中想實現(xiàn)的那些方法在類里實現(xiàn)出來工坊。實現(xiàn)代碼:
#import "WWDataModel.h"
@interface WWDataModel() <WWNetworkFetcherDelegate>
@end
@implementation WWDataModel
- (void)networkFetcher:(WWNetworkFetcher *)fetcher didReceiveData:(NSData *)data
{
// Handle data
}
- (void)networkFetcher:(WWNetworkFetcher *)fetcher didFailWithError:(NSError *)error
{
// Handle error
}
@end
委托協(xié)議中的方法一般都是"可選的"(optional),因為扮演"受委托者"角色的這個對象未必關系其中的所以方法敢订。
NSData *data = /* data obtained from network */;
if ([_delegate respondsToSelector:@selector(networkFetcher:didReceiveData:)]) {
[_delegate networkFetcher:self didReceiveData:data];
}
- (void)networkFetcher:(WWNetworkFetcher *)fetcher didReceiveData:(NSData *)data{
if (fetcher == _myFetcherA) {
// Handle data
} else if (fetcher == _myFetcherB) {
// Handle data
}
}
第二條:將類的實現(xiàn)代碼分散到便于管理的數(shù)個分類中王污。
#import <Foundation/Foundation.h>
@interface WWPerson : NSObject
@property (nonatomic, copy, readonly) NSString *firstName;
@property (nonatomic, copy, readonly) NSString *lastName;
@property (nonatomic, strong, readonly) NSArray *friends;
- (id)initWithFirstName:(NSString *)firstName andLastName:(NSString *)lastName;
/**
* Friendship methods
*/
- (void)addFriend:(WWPerson *)person;
- (void)removeFriend:(WWPerson *)person;
- (BOOL)isFriendsWith:(WWPerson *)person;
/**
* Works methods
*/
- (void)performDaysWork;
- (void)takeVacationFromWork;
/**
* Play methods
*/
- (void)goToTheCinema;
- (void)goToSportsGame;
@end
在分類中可以這么寫:
#import <Foundation/Foundation.h>
@interface WWPerson : NSObject
@property (nonatomic, copy, readonly) NSString *firstName;
@property (nonatomic, copy, readonly) NSString *lastName;
@property (nonatomic, strong, readonly) NSArray *friends;
- (id)initWithFirstName:(NSString *)firstName andLastName:(NSString *)lastName;
@end
/**
* Friendship methods
*/
@interface WWPerson(Friendship)
- (void)addFriend:(WWPerson *)person;
- (void)removeFriend:(WWPerson *)person;
- (BOOL)isFriendsWith:(WWPerson *)person;
@end
/**
* Works methods
*/
@interface WWPerson(Work)
- (void)performDaysWork;
- (void)takeVacationFromWork;
@end
/**
* Play methods
*/
@interface WWPerson(Play)
- (void)goToTheCinema;
- (void)goToSportsGame;
@end
也可以分多個類來實現(xiàn),放在多個h和m文件中楚午。
WWPerson + Friendship(.h/.m)
WWPerson + Work(.h/.m)
WWPerson + Play(.h/.m)
//WWPerson + Friendship.h
#import "WWPerson.h"
@interface WWPerson(Friendship)
- (void)addFriend:(WWPerson *)person;
- (void)removeFriend:(WWPerson *)person;
- (BOOL)isFriendsWith:(WWPerson *)person;
@end
//WWPerson + Friendship.m
#import "WWPerson + Friendship.h"
@implementation WWPerson (Friendship)
@end
將代碼打散到分類中有個好處就是便于調試:對于某個分類中的所有方法來說昭齐,方法名稱都會出現(xiàn)在其符號中。
第三條:總是為第三方類的分類名稱加前綴醒叁。分類機制通常用于向無源碼的既有類中新增功能司浪。這個特性非常強大泊业,但是在使用時也容易忽略其中可能產(chǎn)生的問題:分類中的方法是直接添加在類里面把沼,他們就好比這個類中的固有方法運行期系統(tǒng)會把分類中隨時向的每個方法都加入類的方法列表中。如果類中本來就有這個方法吁伺,而分類又實現(xiàn)了一次饮睬,那么分類中的方法會覆蓋原來的那一份實現(xiàn)代碼。
要點:向第三方類中添加分類時篮奄,總應給其名稱加上你專用的前綴(我的就用:LXW)
向第三方類中添加分類時捆愁,總應給其中的方法名加上你專用的前綴割去。
第四條:勿在分類中聲明屬性。屬性是封裝數(shù)據(jù)的方式昼丑。盡管從技術上呻逆,分類里也可以聲明屬性,但這種做法還是要盡量避免菩帝,因為除了在"class-continuation分類"之外咖城,其他的分類都無法向類中新增實例變量,因此他們無法把實現(xiàn)屬性所需的實例變量合成出來呼奢。
第五條:使用"class-continuation分類"隱藏實現(xiàn)細節(jié)宜雀。類中經(jīng)常會包含一些無須對外公布的方法及實例變量握础。其實這些內容也可以對外公布辐董,并寫明其為私有,開發(fā)者不應依賴他們禀综。OC動態(tài)消息系統(tǒng)的工作方式?jīng)Q定了其不可能實現(xiàn)真正的私有方法或私有實例變量简烘。然而我們最好還是只把確實需要對外公布的內部分公開,此時"class-continuation分類"就能用了菇存。"class-continuation分類"和普通的分類不同夸研,他必須定義在其所接續(xù)的那個類的實現(xiàn)文件里。其重要之處在于依鸥,這是唯一能聲明實例變量的分類亥至,而且此類沒有特定的實現(xiàn)文件,其中的方法都應該定義在類的主實現(xiàn)文件中贱迟、與其他分類不同姐扮,"class-continuation分類"沒有名稱。寫法如下:
@interface WWPerson ()
//methods here
@end
編寫Object-C++代碼時衣吠,"class-continuation分類"也很重要茶敏。Object-C++是Object——C與C++的混合體,其代碼可以使用這兩種語音來編寫缚俏。由于兼容性原因惊搏,游戲后端一般用C++來寫。有時候使用的第三方庫可能只有C++綁定忧换,此時也必須要用C++來編碼恬惯。如:
#import <Foundation/Foundation.h>
#include "SomeCppClass.h"
@interface WWClass : NSObject {
@private
SomeCppClass _cppClass;
}
@end
該類的實現(xiàn)文件可能叫做WWClass.mm,其中.mm擴展名表示編譯器應該將次文件按Object-C++來編譯亚茬。否則就無法正確的引入SomeCppClass.h了酪耳。然而名為SomeCppClass的這個C++類必須完全引入,所以只要包含WWClass.h的類都必須用Object-C++編譯才行刹缝,這樣最終會導致整個引用都要用Object-C++編譯碗暗。我們可以直接用"class-continuation分類"解決這個問題颈将,在WWCLass.mm文件中:
//WWCLass.mm
#import "WWClass.h"
#include "SomeCppClass.h"
@interface WWClass () {
SomeCppClass _cppClass;
}
@end
@implementation WWClass
@end
改寫后,起頭文件就沒有C++代碼了言疗。代理也可以用這個方法解決問題晴圾。
要點:
1.通過"class-continuation分類"向類中新增實例變量。
2.如果某屬性在主接口中聲明為"只讀"噪奄,而類的內部又要用設置方法來修改此屬性疑务,那么就在"class-continuation分類"中將其擴展為"可讀寫"。
3.把私有方法的原型聲明在"class-continuation分類"里面梗醇。
4.若想使類歲遵循的協(xié)議不為人所知知允,則可于"class-continuation分類"中聲明。
第六條:通過協(xié)議提供匿名對象叙谨。協(xié)議可在某種程度上提供匿名類型温鸽。具體的對象類型可以淡化成遵從某協(xié)議的id類型,協(xié)議里規(guī)定了對象所應實現(xiàn)的方法手负。使用匿名對象來硬菜類型名稱(或類名)涤垫。如果具體類型不重要,重要的是對象能夠響應(定義在協(xié)議里的)特定方法竟终,那么可以使用匿名對象來表示蝠猬。
最后,本書一共7個章節(jié)统捶,此為第四章節(jié):協(xié)議與分類榆芦。
共勉!一步一個巴掌印喘鸟。匆绣。。什黑。崎淳。