第2章 對象筋现、消息、運行期

第6條:理解屬性這一概念

可以使用@property語法來定義對象中所封裝的數(shù)據(jù)箱歧。

通過“特質(zhì)”來指定存取數(shù)據(jù)所需的正確語句矾飞。

在設(shè)置屬性所對應的實例變量時,一定要遵從該屬性所聲明的語義呀邢。

開發(fā)iOS程序是應盡量使用nonatomic屬性洒沦,因為atomic屬性會嚴重影響性能。

@synthesize語法指定實例變量的名字价淌。@synthesize firstName = _myFirstName;

@dynamic:它會告訴編譯器:不要自動創(chuàng)建實例變量和存儲方法申眼。

assign:簡單賦值操作。

strong:設(shè)置方法先保留新值蝉衣,并釋放舊值括尸,然后將新值設(shè)置上去。

weak:設(shè)置方法既不保留新值病毡,也不釋放舊值濒翻。摧毀時,屬性值清空(nil out);

unsafa_unretained:與assign相同啦膜,但摧毀時肴焊,屬性值不會自動清空,與weak有區(qū)別功戚。

copy:設(shè)置方法不保留新值,而是將其拷貝似嗤。

第7條:在對象內(nèi)部盡量直接訪問實例變量

由于不經(jīng)過OC的“方法派發(fā)”步驟啸臀,所以直接訪問實例變量的速度較快。在這種情況下烁落,編譯器所生成的代碼會直接訪問保存對象實例變量的那塊內(nèi)存乘粒。

直接訪問實例變量時,不會調(diào)用其“設(shè)置方法”伤塌,這就繞過了為其屬性所定義的“內(nèi)存管理語義”灯萍。比方說,如果在ARC下直接訪問一個聲明為copy的屬性每聪,那么并不會拷貝該屬性旦棉,只會保留新值齿风,并釋放舊值。

如果直接訪問實例變量绑洛,那么不會觸發(fā)“鍵值觀測”(KVO)通知救斑。這樣做是否會產(chǎn)生問題,還取決于具體的對象行為真屯。

通過屬性來訪問有助于排查與之相關(guān)的錯誤脸候。

在對象內(nèi)部讀取數(shù)據(jù)時,應該直接通過實例變量來讀绑蔫,而在寫入數(shù)據(jù)時运沦,則應通過屬性來寫。

在初始化方法及dealloc方法中配深,總是應該直接通過實例變量來讀寫數(shù)據(jù)携添。

有時會使用懶加載,這種情況下凉馆,需要通過屬性來讀取數(shù)據(jù)薪寓。

第8條:理解“對象等同性”這一概念

若想檢測對象的等同性,請?zhí)峁癷sEqual:”與hash方法澜共。

相同的對象必須具有相同的哈希碼向叉,但是兩個哈希碼相同的對象卻未必相同。

不要盲目地逐個檢測每條屬性嗦董,而是應該依照具體需求來制定檢測方案母谎。

編寫hash方法時,應該使用計算速度快而且哈希碼碰撞幾率低的算法京革。

第9條:以“類族模式”隱藏實現(xiàn)細節(jié)

類族模式可以把實現(xiàn)細節(jié)隱藏在一套簡單的公共接口后面奇唤。

系統(tǒng)框架中經(jīng)常使用類族。

從類族的公共抽象基類中繼承子類時要小心匹摇,若有開發(fā)文檔咬扇,首先閱讀。

第10條:在既有類中使用關(guān)聯(lián)對象存放自定義數(shù)據(jù)

可以通過“關(guān)聯(lián)對象”機制來把兩個對象連起來廊勃。

定義關(guān)聯(lián)對象時可指定內(nèi)存管理語義懈贺,用以模仿定義屬性時所采用的“擁有關(guān)系”與“非擁有關(guān)系”。

只有在其他做法不可行時才應選擇關(guān)聯(lián)對象坡垫,因為這種做法通常會引入難以查找的bug梭灿。

第11條:理解objc_msgSend的作用

消息由接受者、選擇子及參數(shù)構(gòu)成冰悠。給某對象“發(fā)送消息(invoke a message)”也就是相當于在該對象上“調(diào)用方法”(call a method)堡妒。

發(fā)給某對象的全部消息都要由“動態(tài)消息派發(fā)系統(tǒng)”(dynamic message dispatch sysytem)來處理,該系統(tǒng)會查出對應的方法溉卓,并執(zhí)行其代碼皮迟。

第12條:理解消息轉(zhuǎn)發(fā)機制

若對象無法響應某個選擇子搬泥,則進入消息轉(zhuǎn)發(fā)流程。

通過運行期的動態(tài)方法解析功能万栅,我們可以在需要用到某個方法時再將其加入類中佑钾。

對象可以把其無法解讀的某些選擇子轉(zhuǎn)交給其他對象處理。

經(jīng)過上述兩步之后烦粒,如果還是沒有辦法處理選擇子休溶,那就啟動完整的消息轉(zhuǎn)發(fā)機制。

第13條:用“方法調(diào)配技術(shù)”調(diào)試“黑盒方法”

在運行期扰她,可以向類中新增或替換選擇子所對應的方法實現(xiàn)兽掰。

使用另一份實現(xiàn)來替換原有的方法實現(xiàn),這道工序叫做“方法調(diào)配”徒役,開發(fā)者常用此技術(shù)向原有實現(xiàn)中添加新功能孽尽。

一般來說,只有調(diào)試程序的時候才需要在運行期修改方法實現(xiàn)忧勿,這種方法不易濫用杉女。

第14條:理解“類對象”的用意

每個實例都有一個指向 Class 對象的指針,用以表明其類型鸳吸,而這些 Class 對象則構(gòu)成了類的繼承體系熏挎。

如果對象類型無法再編譯期確定,那么就應該使用類型信息查詢(is kind of class)來探知晌砾。

盡量使用類型信息查詢方法來確定對象類型坎拐,而不要直接比較類對象,因為某些對象可能實現(xiàn)了消息轉(zhuǎn)發(fā)功能养匈。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末哼勇,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子呕乎,更是在濱河造成了極大的恐慌积担,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,651評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件猬仁,死亡現(xiàn)場離奇詭異帝璧,居然都是意外死亡,警方通過查閱死者的電腦和手機逐虚,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,468評論 3 392
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來谆膳,“玉大人叭爱,你說我怎么就攤上這事∈。” “怎么了买雾?”我有些...
    開封第一講書人閱讀 162,931評論 0 353
  • 文/不壞的土叔 我叫張陵把曼,是天一觀的道長。 經(jīng)常有香客問我漓穿,道長嗤军,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,218評論 1 292
  • 正文 為了忘掉前任晃危,我火速辦了婚禮叙赚,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘僚饭。我一直安慰自己震叮,他們只是感情好,可當我...
    茶點故事閱讀 67,234評論 6 388
  • 文/花漫 我一把揭開白布鳍鸵。 她就那樣靜靜地躺著苇瓣,像睡著了一般。 火紅的嫁衣襯著肌膚如雪偿乖。 梳的紋絲不亂的頭發(fā)上击罪,一...
    開封第一講書人閱讀 51,198評論 1 299
  • 那天,我揣著相機與錄音贪薪,去河邊找鬼媳禁。 笑死,一個胖子當著我的面吹牛古掏,可吹牛的內(nèi)容都是我干的损话。 我是一名探鬼主播,決...
    沈念sama閱讀 40,084評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼槽唾,長吁一口氣:“原來是場噩夢啊……” “哼丧枪!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起庞萍,我...
    開封第一講書人閱讀 38,926評論 0 274
  • 序言:老撾萬榮一對情侶失蹤拧烦,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后钝计,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體恋博,經(jīng)...
    沈念sama閱讀 45,341評論 1 311
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,563評論 2 333
  • 正文 我和宋清朗相戀三年私恬,在試婚紗的時候發(fā)現(xiàn)自己被綠了债沮。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,731評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡本鸣,死狀恐怖疫衩,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情荣德,我是刑警寧澤闷煤,帶...
    沈念sama閱讀 35,430評論 5 343
  • 正文 年R本政府宣布童芹,位于F島的核電站,受9級特大地震影響鲤拿,放射性物質(zhì)發(fā)生泄漏假褪。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,036評論 3 326
  • 文/蒙蒙 一近顷、第九天 我趴在偏房一處隱蔽的房頂上張望生音。 院中可真熱鬧,春花似錦幕庐、人聲如沸久锥。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,676評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽瑟由。三九已至,卻和暖如春冤寿,著一層夾襖步出監(jiān)牢的瞬間歹苦,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,829評論 1 269
  • 我被黑心中介騙來泰國打工督怜, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留殴瘦,地道東北人。 一個月前我還...
    沈念sama閱讀 47,743評論 2 368
  • 正文 我出身青樓号杠,卻偏偏與公主長得像蚪腋,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子姨蟋,可洞房花燭夜當晚...
    茶點故事閱讀 44,629評論 2 354

推薦閱讀更多精彩內(nèi)容