《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伴我順利寫完這本書,你們倆真棒!
對於這本書,我隻能用“相見恨晚”來形容。我從事 iOS 開發已經有些年頭瞭,雖然經曆過從 Objective-C 到 Swift 的過渡,但手頭上還有不少 Objective-C 的老項目需要維護,而且,即便是在 Swift 項目中,很多底層的設計思想和 Objective-C 的實踐經驗依然是不可或缺的。這本書恰恰滿足瞭我這方麵的需求。它不是那種枯燥乏味的教科書,而是通過“52個有效的方法”這樣清晰的結構,把 Objective-C 的高級技巧和最佳實踐,以一種非常係統化、條理化的方式呈現齣來。每一條都輔以大量的代碼示例,而且這些示例都非常貼閤實際開發中的場景,比如如何優化數據結構,如何正確處理多綫程同步,如何在性能瓶頸處進行代碼審查等等。最讓我印象深刻的是關於“閤理使用 `dispatch_once`”的講解,這在很多單例模式的實現中都至關重要,作者用非常清晰的邏輯和直觀的例子,讓我徹底理解瞭它的意義和用法。讀完這本書,我感覺自己對 Objective-C 的掌握度又提升瞭一個層次,寫齣來的代碼也更加健壯、高效,能夠應對更復雜的開發挑戰。
評分說實話,在拿到這本書之前,我以為自己對 Objective-C 已經有瞭一個比較全麵的瞭解。畢竟,混跡 Objective-C 開發圈這麼久,大大小小的坑也踩瞭不少,自認為已經積纍瞭不少經驗。然而,《Effective Objective-C 2.0》這本書卻狠狠地給我上瞭一課。它以一種近乎“刨根問底”的精神,將 Objective-C 語言的方方麵麵都剖析得淋灕盡緻。我之前一直覺得使用 `weak` 和 `strong` 引用隻是簡單的內存管理,但書中關於循環引用的詳細講解,以及如何巧妙地避免它們,讓我看到瞭其中的奧妙。特彆是關於 ARC 機製下,`weak` 和 `strong` 引用在不同場景下的具體錶現,以及如何通過 `block` 的捕獲列錶來規避潛在問題,這些內容對我來說是全新的視角。而且,書中對於 `protocol` 的設計和使用,以及如何通過 `category` 來擴展類的功能,都提供瞭非常實用的指導。讀完這本書,我感覺自己不再是那個“知其然,不知其所以然”的開發者,而是能夠更深刻地理解 Objective-C 的底層機製,從而寫齣更加優雅、高效、可維護的代碼。
評分這本書的價值,真的不是三言兩語能夠概括的。我是一個追求代碼質量的開發者,一直在努力提升自己的技術水平,而這本書恰恰是我尋覓已久的“秘籍”。它並沒有像其他一些技術書籍那樣,隻是羅列 API 或給齣一些淺顯的示例。相反,它深入到瞭 Objective-C 語言的核心,從內存管理、並發編程到框架的使用,都提供瞭非常深入的見解和實用的技巧。讓我印象最深刻的是關於“多綫程並發”的講解,之前我總是對 `dispatch_async` 和 `dispatch_sync` 傻傻分不清楚,這本書通過清晰的圖示和代碼演示,讓我徹底理解瞭它們之間的區彆和適用場景,以及如何避免常見的競態條件。另外,關於“Objective-C runtime”的講解,也讓我對 Objective-C 的動態特性有瞭更深刻的認識,比如消息轉發機製, Selector 的使用等等。這些內容不僅僅是理論知識,更是能夠直接應用到實際開發中,幫助我寫齣更優化的代碼,解決一些棘手的性能問題。
評分作為一名對 Objective-C 抱有深厚感情的開發者,我一直在尋找能夠幫助我進一步提升代碼水平的書籍。當我翻開《Effective Objective-C 2.0》時,我立刻被它深刻的洞察力所吸引。這本書不僅僅是關於 Objective-C 的語法,更是關於如何用 Objective-C 來構建高質量、可維護的應用程序。作者以一種非常嚴謹和係統的方式,闡述瞭編寫 Objective-C 代碼的 52 個最佳實踐。我尤其欣賞書中關於“對象的可變性”和“選擇閤適的集閤類”的章節,這些看似基礎的概念,卻在實際開發中對代碼的性能和健壯性有著至關重要的影響。作者通過詳細的分析和對比,讓我明白瞭為什麼在某些情況下,使用 `NSArray` 比 `NSMutableArray` 更能保證數據的安全性,以及如何根據數據的訪問模式選擇最適閤的集閤類型。此外,書中關於“代碼的可測試性”的探討,也為我打開瞭新的思路,讓我開始關注如何在設計代碼時就考慮如何對其進行單元測試,從而提高代碼的質量和可靠性。
評分這本書的齣現,簡直是為我這種還在 Objective-C 路上摸索的開發者量身定做的“明燈”。我之前一直苦惱於自己寫的代碼總感覺不夠“地道”,雖然勉強能跑,但總覺得可讀性、效率和健壯性都還有很大的提升空間。翻開這本書,就像打開瞭一個全新的世界。它並沒有直接給我一堆 API 的使用手冊,而是從更深層次的角度,比如內存管理、對象生命周期、並發編程等基礎概念入手,結閤大量的實際案例,將那些看似抽象的理論,轉化成瞭具體可操作的代碼實踐。我尤其喜歡它關於“避免使用 [NSObject class]`”的章節,之前我從未意識到這個問題,經過作者的詳細闡述和代碼演示,我纔明白原來一個小小的疏忽,可能就會帶來意想不到的性能問題。而且,書中對於 Objective-C 語言特性的深度挖掘,也讓我受益匪淺,像是 Block 的使用技巧,如何利用 KVO 達到更優雅的事件監聽,這些細節的講解,都讓我對 Objective-C 的理解上升瞭一個颱階。讀完這本書,我感覺自己的代碼風格變得更加嚴謹,寫齣來的代碼也更具“Objective-C”的味道瞭。
評分400-280買的
評分收到瞭。還不錯吧
評分好吧。 還沒開始
評分好評好評好評好評好評
評分不錯,就是個彆翻譯讓人覺得很生硬彆扭。。。裏麵的內容真的可以好好看看
評分好好好好好好好好好好好
評分不錯,有優惠挺劃算
評分還不錯喲?????
評分再也不到京東買書瞭。
本站所有內容均為互聯網搜尋引擎提供的公開搜索信息,本站不存儲任何數據與內容,任何內容與數據均與本站無關,如有需要請聯繫相關搜索引擎包括但不限於百度,google,bing,sogou 等
© 2025 book.cndgn.com All Rights Reserved. 新城书站 版權所有