TOP
0
0
7/10中午12點鄧紫棋首部科幻小說搶先預購中
Effectiv Objective-C 2、0:編寫高品質iOS與OS X代碼的52個有效方法(簡體書)
滿額折

Effectiv Objective-C 2、0:編寫高品質iOS與OS X代碼的52個有效方法(簡體書)

商品資訊

人民幣定價:69 元
定價
:NT$ 414 元
優惠價
87360
海外經銷商無庫存,到貨日平均30天至45天
下單可得紅利積點:10 點
商品簡介
作者簡介
目次
書摘/試閱

商品簡介

本書是世界級C++開發大師Scott Meyers親自擔當顧問編輯的“Effective Software Development Series”系列叢書中的新作,Amazon全五星評價。從語法、介面與API設計、記憶體管理、框架等7大方面總結和探討了Objective-C程式設計中52個鮮為人知和容易被忽視的特性與陷阱。書中包含大量實用範例代碼,為編寫易於理解、便於維護、易於擴展和高效的Objective-C應用提供了解決方案。
全書共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語言中的指針是用來指示對象的。想要聲明一個變量,令其指代某個對象,可用如下語法:

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實例的內存地址。

您曾經瀏覽過的商品

購物須知

大陸出版品因裝訂品質及貨運條件與台灣出版品落差甚大,除封面破損、內頁脫落等較嚴重的狀態,其餘商品將正常出貨。

特別提醒:部分書籍附贈之內容(如音頻mp3或影片dvd等)已無實體光碟提供,需以QR CODE 連結至當地網站註冊“並通過驗證程序”,方可下載使用。

無現貨庫存之簡體書,將向海外調貨:
海外有庫存之書籍,等候約45個工作天;
海外無庫存之書籍,平均作業時間約60個工作天,然不保證確定可調到貨,尚請見諒。

為了保護您的權益,「三民網路書店」提供會員七日商品鑑賞期(收到商品為起始日)。

若要辦理退貨,請在商品鑑賞期內寄回,且商品必須是全新狀態與完整包裝(商品、附件、發票、隨貨贈品等)否則恕不接受退貨。

優惠價:87 360
海外經銷商無庫存,到貨日平均30天至45天

暢銷榜

客服中心

收藏

會員專區