商品簡介
全書共7章。第1章通論與Objective-C的核心概念相關的技巧;第2章講述的技巧與物件導向語言的重要特徵(物件、消息和運行期)相關;第3章介紹的技巧與介面和API設計相關;第4章講述協議與分類相關的技巧;第5章介紹記憶體管理中易犯的錯誤以及如何避免犯這些錯誤;第6章介紹塊與大中樞派發相關的技巧;第7章講解使用Cocoa和Cocoa Touch系統框架時的相關技巧。
作者簡介
目次
譯者序
前言
致謝
第1章 熟悉Objective-C
第1條:了解Objective-C語言的起源
第2條:在類的頭文件中盡量少引入其他頭文件
第3條:多用字面量語法,少用與之等價的方法
第4條:多用類型常量,少用#define預處理指令
第5條:用枚舉表示狀態、選項、狀態碼
第2章 對象、消息、運行期
第6條:理解屬性這一概念
第7條:在對象內部盡量直接訪問實例變量
第8條:理解對象等同性這一概念
第9條:以類族模式隱藏實現細節
第10條:在既有類中使用關聯對象存放自定義數據
第11條:理解objc_msgSend的作用
第12條:理解消息轉發機制
第13條:用方法調配技術調試黑盒方法
第14條:理解類對象的用意
第3章 接口與API設計
第15條:用前綴避免命名空間沖突
第16條:提供全能初始化方法
第17條:實現description方法
第18條:盡量使用不可變對象
第19條:使用清晰而協調的命名方式
第20條:為私有方法名加前綴
第21條:理解Objective-C錯誤模型
第22條:理解NSCopying協議
第4章 協議與分類
第23條:通過委托與數據源協議進行對象間通信
第24條:將類的實現代碼分散到便于管理的數個分類之中
第25條:總是為第三方類的分類名稱加前綴
第26條:勿在分類中聲明屬性
第27條:使用class-continuation分類隱藏實現細節
第28條:通過協議提供匿名對象
第5章 內存管理
第29條:理解引用計數
第30條:以ARC簡化引用計數
第31條:在dealloc方法中只釋放引用并解除監聽
第32條:編寫異常安全代碼時留意內存管理問題
第33條:以弱引用避免保留環
第34條:以自動釋放池塊降低內存峰值
第35條:用僵尸對象調試內存管理問題
第36條:不要使用retainCount
第6章 塊與大中樞派發
第37條:理解塊這一概念
第38條:為常用的塊類型創建typedef
第39條:用handler塊降低代碼分散程度
第40條:用塊引用其所屬對象時不要出現保留環
第41條:多用派發隊列,少用同步鎖
第42條:多用GCD,少用performSelector系列方法
第43條:掌握GCD及操作隊列的使用時機
第44條:通過Dispatch Group機制,根據系統資源狀況來執行任務
第45條:使用dispatch_once來執行只需運行一次的線程安全代碼
第46條:不要使用dispatch_get_current_queue
第7章 系統框架
第47條:熟悉系統框架
第48條:多用塊枚舉,少用for循環
第49條:對自定義其內存管理語義的collection使用無縫橋接
第50條:構建緩存時選用NSCache而非NSDictionary
第51條:精簡initialize與load的實現代碼
第52條:別忘了NSTimer會保留其目標對象
書摘/試閱
第1章
熟悉Objective-C
Objective-C通過一套全新語法,在C語言基礎上添加了面向對象特性。Objective-C的語法中頻繁使用方括號,而且不吝于寫出極長的方法名,這通常令許多人覺得此語言較為冗長。其實這樣寫出來的代碼十分易讀,只是C++或Java程序員不太能適應。
Objective-C語言學起來很快,但有很多微妙細節需注意,而且還有許多容易為人所忽視的特性。另一方面,有些開發者并未完全理解或是容易濫用某些特性,導致寫出來的代碼難于維護且不易調試。本章講解基礎知識,后續各章談論語言及其相關框架中的各個特定話題。
第1條:了解Objective-C語言的起源
Objective-C與C++、Java等面向對象語言類似,不過很多方面有所差別。若是用過另一種面向對象語言,那么就能理解Objective-C所用的許多范式與模板了。然而語法上也許會顯得陌生,因為該語言使用“消息結構”(messagingstructure)而非“函數調用”(functioncalling)。Objective-C語言由Smalltalk演化而來,后者是消息型語言的鼻祖。消息與函數調用之間的區別看上去就像這樣:
//Messaging(Objective-C)
Object*obj=[Objectnew];
[objperformWith:parameter1and:parameter2];
//Functioncalling(C++)
Object*obj=newObject;
obj->perform(parameter1,parameter2);
關鍵區別在于:使用消息結構的語言,其運行時所應執行的代碼由運行環境來決定;而使用函數調用的語言,則由編譯器決定。如果范例代碼中調用的函數是多態的,那么在運行時就要按照“虛方法表”(virtualtable)來查出到底應該執行哪個函數實現。而采用消息結構的語言,不論是否多態,總是在運行時才會去查找所要執行的方法。實際上,編譯器甚至不關心接收消息的對象是何種類型。接收消息的對象問題也要在運行時處理,其過程叫做“動態綁定”(dynamicbinding),第11條會詳述其細節。
Objective-C的重要工作都由“運行期組件”(runtimecomponent)而非編譯器來完成。使用Objective-C的面向對象特性所需的全部數據結構及函數都在運行期組件里面。舉例來說,運行期組件中含有全部內存管理方法。運行期組件本質上就是一種與開發者所編代碼相鏈接的“動態庫”(dynamiclibrary),其代碼能把開發者編寫的所有程序粘合起來。這樣的話,只需更新運行期組件,即可提升應用程序性能。而那種許多工作都在“編譯期”(compiletime)完成的語言,若想獲得類似的性能提升,則要重新編譯應用程序代碼。
Objective-C是C的“超集”(superset),所以C語言中的所有功能在編寫Objective-C代碼時依然適用。因此,必須同時掌握C與Objective-C這兩門語言的核心概念,方能寫出高效的Objective-C代碼來。其中尤為重要的是要理解C語言的內存模型(memorymodel),這有助于理解Objective-C的內存模型及其“引用計數”(referencecounting)機制的工作原理。若要理解內存模型,則需明白:Objective-C語言中的指針是用來指示對象的。想要聲明一個變量,令其指代某個對象,可用如下語法:
NSString*someString=@“Thestring”;
這種語法基本上是照搬C語言的,它聲明了一個名為someString的變量,其類型是NSString*。也就是說,此變量為指向NSString的指針。所有Objective-C語言的對象都必須這樣聲明,因為對象所占內存總是分配在“堆空間”(heapspace)中,而絕不會分配在“棧”(stack)上。不能在棧中分配Objective-C對象:
NSStringstackString;
//error:interfacetypecannotbestaticallyallocated
someString變量指向分配在堆里的某塊內存,其中含有一個NSString對象。也就是說,如果再創建一個變量,令其指向同一地址,那么并不拷貝該對象,只是這兩個變量會同時指向此對象:
NSString*someString=@“Thestring”;
NSString*anotherString=someString;
只有一個NSString實例,然而有兩個變量指向此實例。兩個變量都是NSString*型,這說明當前“棧幀”(stackframe)里分配了兩塊內存,每塊內存的大小都能容下一枚指針(在32位架構的計算機上是4字節,64位計算機上是8字節)。這兩塊內存里的值都一樣,就是NSString實例的內存地址。
主題書展
更多書展今日66折
您曾經瀏覽過的商品
購物須知
大陸出版品因裝訂品質及貨運條件與台灣出版品落差甚大,除封面破損、內頁脫落等較嚴重的狀態,其餘商品將正常出貨。
特別提醒:部分書籍附贈之內容(如音頻mp3或影片dvd等)已無實體光碟提供,需以QR CODE 連結至當地網站註冊“並通過驗證程序”,方可下載使用。
無現貨庫存之簡體書,將向海外調貨:
海外有庫存之書籍,等候約45個工作天;
海外無庫存之書籍,平均作業時間約60個工作天,然不保證確定可調到貨,尚請見諒。
為了保護您的權益,「三民網路書店」提供會員七日商品鑑賞期(收到商品為起始日)。
若要辦理退貨,請在商品鑑賞期內寄回,且商品必須是全新狀態與完整包裝(商品、附件、發票、隨貨贈品等)否則恕不接受退貨。