閱讀Effective Object-C 2.0 筆記(四)

還是要好好學習英文啊搬俊,筆者只能看中文版的,下載地址如下:
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é)議與分類榆芦。

共勉!一步一個巴掌印喘鸟。匆绣。。什黑。崎淳。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市愕把,隨后出現(xiàn)的幾起案子拣凹,更是在濱河造成了極大的恐慌,老刑警劉巖恨豁,帶你破解...
    沈念sama閱讀 212,454評論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件嚣镜,死亡現(xiàn)場離奇詭異,居然都是意外死亡圣絮,警方通過查閱死者的電腦和手機祈惶,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,553評論 3 385
  • 文/潘曉璐 我一進店門雕旨,熙熙樓的掌柜王于貴愁眉苦臉地迎上來扮匠,“玉大人捧请,你說我怎么就攤上這事“羲眩” “怎么了疹蛉?”我有些...
    開封第一講書人閱讀 157,921評論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長力麸。 經(jīng)常有香客問我可款,道長,這世上最難降的妖魔是什么克蚂? 我笑而不...
    開封第一講書人閱讀 56,648評論 1 284
  • 正文 為了忘掉前任闺鲸,我火速辦了婚禮,結果婚禮上埃叭,老公的妹妹穿的比我還像新娘摸恍。我一直安慰自己,他們只是感情好赤屋,可當我...
    茶點故事閱讀 65,770評論 6 386
  • 文/花漫 我一把揭開白布立镶。 她就那樣靜靜地躺著,像睡著了一般类早。 火紅的嫁衣襯著肌膚如雪媚媒。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,950評論 1 291
  • 那天涩僻,我揣著相機與錄音缭召,去河邊找鬼。 笑死逆日,一個胖子當著我的面吹牛恼琼,可吹牛的內容都是我干的。 我是一名探鬼主播屏富,決...
    沈念sama閱讀 39,090評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼晴竞,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了狠半?” 一聲冷哼從身側響起噩死,我...
    開封第一講書人閱讀 37,817評論 0 268
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎神年,沒想到半個月后已维,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,275評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡已日,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 36,592評論 2 327
  • 正文 我和宋清朗相戀三年垛耳,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,724評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡堂鲜,死狀恐怖栈雳,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情缔莲,我是刑警寧澤哥纫,帶...
    沈念sama閱讀 34,409評論 4 333
  • 正文 年R本政府宣布,位于F島的核電站痴奏,受9級特大地震影響蛀骇,放射性物質發(fā)生泄漏。R本人自食惡果不足惜读拆,卻給世界環(huán)境...
    茶點故事閱讀 40,052評論 3 316
  • 文/蒙蒙 一擅憔、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧檐晕,春花似錦雕欺、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,815評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至伞矩,卻和暖如春笛洛,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背乃坤。 一陣腳步聲響...
    開封第一講書人閱讀 32,043評論 1 266
  • 我被黑心中介騙來泰國打工苛让, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人湿诊。 一個月前我還...
    沈念sama閱讀 46,503評論 2 361
  • 正文 我出身青樓狱杰,卻偏偏與公主長得像,于是被迫代替她去往敵國和親厅须。 傳聞我的和親對象是個殘疾皇子仿畸,可洞房花燭夜當晚...
    茶點故事閱讀 43,627評論 2 350

推薦閱讀更多精彩內容