發表於2024-11-23
《Effective Objective-C 2.0:編寫高質量iOS與OS X代碼的52個有效方法》是C++開發大師Scott Meyers親自擔當顧問編輯的“Effective Software Development Series”係列叢書中的新作。從語法、接口與API設計、內存管理、框架等7大方麵總結和探討瞭Objective-C編程中52個鮮為人知和容易被忽視的特性與陷阱。書中包含大量實用範例代碼,為編寫易於理解、便於維護、易於擴展和高效的Objective-C應用提供瞭解決方案。
《Effective Objective-C 2.0:編寫高質量iOS與OS X代碼的52個有效方法》共7章。第1章通論與Objective-C的核心概念相關的技巧;第2章講述的技巧與麵嚮對象語言的重要特徵(對象、消息和運行期)相關;第3章介紹的技巧與接口和API設計相關;第4章講述協議與分類相關的技巧;第5章介紹內存管理中易犯的錯誤以及如何避免犯這些錯誤;第6章介紹塊與大中樞派發相關的技巧;第7章講解使用Cocoa和Cocoa Touch係統框架時的相關技巧。
Matt Galloway,資深軟件開發工程師,精通移動應用程序的開發與設計,畢業於英國劍橋大學,谘詢公司Swipe Stack Ltd.的創始人。經常在Stack Overflow網站(stackoverflow.com)上迴答與Objective-C、iOS和Mac編程相關的問題,經驗非常豐富。
愛飛翔,資深軟件開發工程師,擅長Web開發、移動開發和遊戲開發,有10餘年開發經驗,曾主導和參與瞭多個手機遊戲和手機軟件項目的開發,經驗十分豐富。他對極限編程、設計模式、重構、測試驅動開發、敏捷軟件開發等也有較深入的研究,目前負責敏捷移動開發網的運營。
譯者序
前言
緻謝
第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語言中的指針是用來指示對象的。想要聲明一個變量,令其指代某個對象,可用如下語法:
”;
這種語法基本上是照搬C語言的,它聲明瞭一個名為someString的變量,其類型是NSString*。也就是說,此變量為指嚮NSString的指針。所有Objective-C語言的對象都必須這樣聲明,因為對象所占內存總是分配在“堆空間”(heapspace)中,而絕不會分配在“棧”(stack)上。不能在棧中分配Objective-C對象:
NSStringstackString;
//error:interfacetypecannotbestaticallyallocated
someString變量指嚮分配在堆裏的某塊內存,其中含有一個NSString對象。也就是說,如果再創建一個變量,令其指嚮同一地址,那麼並不拷貝該對象,隻是這兩個變量會同時指嚮此對象:
”;
NSString*anotherString=someString;
隻有一個NSString實例,然而有兩個變量指嚮此實例。兩個變量都是NSString*型,這說明當前“棧幀”(stackframe)裏分配瞭兩塊內存,每塊內存的大小都能容下一枚指針(在32位架構的計算機上是4字節,64位計算機上是8字節)。這兩塊內存裏的值都一樣,就是NSString實例的內存地址。
許多人認為Objective-C這門語言蕪雜、笨拙、彆扭,但筆者卻看到其雅緻、靈活、美觀的一麵。然而,為瞭領略這些優點,大傢不僅要掌握基礎知識,還要理解語言中的特性、陷阱及繁難之處。本書正是要講述這些內容。
關於本書
本書假定讀者已經熟悉瞭Objective-C的語法,所以不再贅述。筆者要講的是怎樣完全發揮這門語言的優勢,以編寫齣良好的代碼。由於其源自Smalltalk,所以Objective-C是一門相當動態的語言。在其他語言中,許多工作都由編譯器來完成;而在Objective-C中,則要於“運行期”(runtime)執行。於是,在測試環境下能正常運行的函數到瞭工作環境中,也許就會因為處理瞭無效數據而不能正確執行。避免此類問題的最佳方案當然是一開始就把代碼寫好。
嚴格地說,許多話題與Objective-C的核心部分並無關聯。本書要談到係統庫中的技術,例如libdispatch庫的“大中樞派發”(GrandCentralDispatch)等。因為當前所說的Objective-C開發就是指開發MacOSX或iOS應用程序,所以,書中也要提及Foundation框架中的許多類,而不僅僅是其基類NSObject。不論開發MacOSX程序還是iOS程序,都無疑會用到係統框架,前者所用的各框架統稱為Cocoa,後者則叫CocoaTouch。
隨著iOS的興起,許多開發者都湧入Objective-C開發陣營。有的程序員初學編程,有的具備Java或C++基礎,還有的則是網頁開發者齣身。為瞭能高效運用Objective-C,無論是哪種情況,你都必須花時間研究這門語言,從而寫齣執行迅速、便於維護、不易齣錯的代碼來。
盡管這本書隻用6個月就寫好瞭,但是其醞釀過程卻長達數年。筆者某天心血來潮,買瞭個iPodTouch,等到第一版SDK發布之後,就決定開發個程序玩玩。我做的第一個“應用程序”叫“SubnetCalc”,其下載量比預想中要多。於是我確信,以後要和這個美妙的語言結緣瞭。從此就一直研究Objective-C,並定期在自己的網站上發錶博文。我對該語言的內部工作原理,諸如“塊”(block)、“自動引用計數”(AutoReferenceCount,ARC)等特彆感興趣。於是,在有機會寫作一本講Objective-C的書時,自然就當仁不讓瞭。
為使本書物盡其用,筆者建議大傢跳讀,直接翻到最感興趣或與當前工作有關的章節來看。可以分開閱讀每條技巧,也可以按其中所引用的條目跳至其他話題,互相參照。相關技巧歸並成章,讀者可根據各章標題快速找到談及某個語言特性的數條技巧。
目標讀者
本書麵嚮那些有誌於深入研究Objective-C的開發者,幫助其編寫便於維護、執行迅速且不易齣錯的代碼。如果你目前還不是Objective-C程序員,但是會用Java或C++這樣麵嚮對象的語言,那麼仍可閱讀此書。在這種情況下,應先瞭解Objective-C的語法。
本書主要內容
本書不打算講Objective-C語言的基礎知識,在許多教材和參考資料中都能找到那些內容。本書要講的是如何高效運用這門語言。書中內容分為若乾條目,每條都是一小塊易於理解的文字。這些條目按其所談話題組織為如下各章。
第1章:熟悉Objective-C
通論該語言的核心概念。
第2章:對象、消息、運行期
對象之間能夠關聯與交互,這是麵嚮對象語言的重要特徵。本章講述這些特徵,並深入研究代碼在運行期的行為。
第3章:接口與API設計
很少有那種寫完就不再復用的代碼。即使代碼不嚮更多人公開,也依然有可能用在自己的多個項目中。本章講解如何編寫與Objective-C搭配得宜的類。
第4章:協議與分類
協議與分類是兩個需要掌握的重要語言特性。若運用得當,則可令代碼易讀、易維護且少齣錯。本章將幫助讀者精通這兩個概念。
第5章:內存管理
Objective-C語言以引用計數來管理內存,這令許多初學者糾結,要是用過以“垃圾收集器”(garbagecollector)來管理內存的語言,那麼更會如此。“自動引用計數”機製緩解瞭此問題,不過使用時有很多重要的注意事項,以確保對象模型正確,不緻內存泄漏。本章提醒讀者注意內存管理中易犯的錯誤。
第6章:塊與大中樞派發
蘋果公司引入瞭“塊”這一概念,其語法類似於C語言擴展中的“閉包”(closure)。在Objective-C語言中,我們通常用塊來實現一些原來需要很多樣闆代碼纔能完成的事情,塊還能實現“代碼分離”(codeseparation)。“大中樞派發”(GrandCentralDispatch,GCD)提供瞭一套用於多綫程環境的簡單接口。“塊”可視為GCD的任務,根據係統資源狀況,這些任務也許能並發執行。本章將教會讀者如何充分運用這兩項核心技術。
第7章:係統框架
大傢通常會用Objective-C來開發MacOSX或iOS程序。在這兩種情況下都有一套完整的係統框架可供使用,前者名為Cocoa,後者名為CocoaTouch。本章將總覽這些框架,並深入研究其中某些類。
緻謝
在問到是否願意寫一本Objective-C的書時,我立刻興奮起來。讀過瞭Effective係列其他書後,我意識到要想寫好這本Objective-C書籍可真是個挑戰。然而在眾人協助之下,這本書終於和大傢見麵瞭。
書中好些靈感都源自許多專述Objective-C的精彩博文。筆者要感謝博文作者MikeAsh、MattGallagher及“bbum”等人。多年來,這些博客幫助我更深地理解瞭Objective-C語言。在編撰本書時,NSHipster及MatttThompson所寫的優秀文章也啓迪瞭我的思路。還要感謝蘋果公司提供瞭極為有用的開發文檔。
在供職於MXTelecom期間,得良師益友之助,我學到瞭許多知識,若沒有這段經曆,恐怕就無法完成此書瞭。感謝MatthewHodgson,令我有機會以一套成熟的C++代碼庫為基礎,開發齣公司首個iOS應用程序,在該項目中學到的本領為我參與後續項目打下瞭基礎。
感謝曆年來保持聯係的各位同仁。大傢時而切磋技藝,時而把酒言歡,這對我寫作本書來說都是種幫助。
與培生集團旗下團隊的閤作相當愉快。TrinaMacDonald、OliviaBasegio、ScottMeyers及ChrisZahn都在需要時給我以幫助與鼓勵。諸位為我提供瞭專心寫書的工具,並迴答瞭必要的問題。
筆者同技術編輯閤作得也非常融洽,你們給瞭我莫大的幫助。仰賴嚴格的審校,方能使本書內容臻於完美。諸位在檢查書稿時認真細緻的態度,也令人稱贊。
最後我要說,此書能問世,愛妻Helen的理解與支持必不可少。準備動筆那天,我們的第一個孩子降生瞭,真正開始寫作是在幾天之後。Helen與Rosie伴我順利寫完這本書,你們倆真棒!
Effective Objective-C 2.0:編寫高質量iOS與OS X代碼的52個有效方法 [Effective Objective-C 2.0] 下載 mobi pdf epub txt 電子書 格式 2024
Effective Objective-C 2.0:編寫高質量iOS與OS X代碼的52個有效方法 [Effective Objective-C 2.0] 下載 mobi epub pdf 電子書送貨很快
評分公司買的。版本比較新。當字典看。
評分還不錯 快看完瞭
評分對學習mios的同學還是很有用的,加油
評分送貨快。沒有質量問題。
評分京東買書就是方便
評分同事推薦買的,還不錯…………
評分再也不到京東買書瞭。
評分好書 ,必買
Effective Objective-C 2.0:編寫高質量iOS與OS X代碼的52個有效方法 [Effective Objective-C 2.0] mobi epub pdf txt 電子書 格式下載 2024