Objective-C編程(第2版)

Objective-C編程(第2版) 下載 mobi epub pdf 電子書 2025

Aaron Hillegass,Mikey Ward 著,王蕾,吳承耀 譯
圖書標籤:
  • Objective-C
  • 編程
  • iOS
  • Cocoa
  • 開發
  • 蘋果
  • 書籍
  • 技術
  • 計算機
  • 程序設計
  • 移動開發
想要找書就要到 圖書大百科
立刻按 ctrl+D收藏本頁
你會得到大驚喜!!
齣版社: 華中科技大學齣版社
ISBN:9787568007948
版次:2
商品編碼:11757916
包裝:平裝
開本:16開
齣版時間:2015-09-01
用紙:膠版紙
頁數:372
正文語種:中文

具體描述

編輯推薦

適讀人群 :程序員、動態語言編程愛好者
  《Objective-C編程(第2版)》英文版自齣版以來,一直蟬聯美國Objective-C編程類圖書榜首。
  編輯推薦相關書籍《iOS編程(第4版)》《Web開發秘方》(華中科技大學齣版社)

內容簡介

  《Objective-C編程(第2版)》講述Objective-C編程語言和基本的iOS/Mac開發知識。作者首先從基本的編程概念講起(變量、條件語句、循環結構等),接著用淺顯易懂的語言講解Objective-C和Foundation的知識,包括Objective-C的基本語法、Foundation常用類、內存管理、常用設計模式等,最後手把手教讀者編寫完整的、基於事件驅動的iOS/Mac應用。書中還介紹瞭Objetive-C的高級內容,包括屬性、範疇和Block對象等知識。全書篇幅精煉,內容清晰,適閤無編程經驗的讀者入門學習。

作者簡介

  Aaron Hillegass,曾就職於NeXT公司和Apple公司,他有近20年的Objective-C編程、Cocoa編程和iOS編程教學經驗。Aaron與他人閤著瞭《iOS編程》。
  2001年,Aaron創辦瞭Big Nerd Ranch公司,開始提供強化式編程課程,為學員提供集中的、沒有乾擾的學習環境。

  Mikey Ward,是Big Nerd Ranch的資深培訓師,他有著30多年的編程經驗。他是CocoaHeads Atlanta的發起人,該團隊緻力於組織各種會議,幫助程序員運用Apple框架開發實用的MAC和iOS應用程序。

精彩書評

  ★好久沒看到這麼經典的書籍瞭,一晚上看瞭三分之一,夜裏兩點瞭,還按耐不住心中的興奮打開電腦寫評論。
  這本書前麵少許篇幅從最基本的C語言講起來,算是簡單迴顧C語言知識。然後過渡到oc語言的基礎和foundation框架。緊接著就開始介紹一個簡單的應用來詮釋要講的概念,接下來就是更高級的block和內存管理之類的高級主題。書很薄,沒有一句廢話,短小精悍,內容清晰。整本書由淺入深,看著很舒服,比喻和例子都很恰當。確實是不可多得的好書。
  最令我感到欣慰的是,這本書翻譯的也很好,目前還沒有發現很低級的錯誤,譯者一定也很用心,在此謝過!
  果斷忍痛去京東花75塊錢把The Big Nerd Ranch的另一本《iOS編程》也買瞭!值!
  ——網友,拉格朗不會日

目錄

第1部分 入 門
第1章 讀者與本書 3
1.1 C語言和Objective-C語言 3
1.2 如何閱讀本書 4
1.3 程序員要走的道路 5
第2章 第一個程序 7
2.1 安裝蘋果開發者工具 7
2.2 Xcode入門 7
2.3 從哪裏開始編寫代碼 10
2.4 如何運行程序 13
2.5 程序是如何産生的 15
2.6 不要半途而廢 16
第2部分 如 何 編 程
第3章 變量與類型 21
3.1 類型 21
3.2 使用變量的程序 22
第4章 if和else 25
4.1 布爾變量 27
4.2 花括號的使用規則 27
4.3 else if 28
4.4 深入學習:條件運算符(三元運算符) 28
第5章 函數 31
5.1 應該在何時使用函數 31
5.2 如何編寫並使用函數 31
5.3 函數間是如何協同工作的 33
5.4 標準庫 34
5.5 局部變量、幀和棧 35
5.6 作用域 37
5.7 遞歸 38
5.8 通過調試器查看幀 40
5.9 返迴 42
5.10 全局變量與靜態變量 43
第6章 格式化字符串 45
6.1 使用格式說明符 46
6.2 轉義字符 46
第7章 數字 49
7.1 整數 49
7.2 浮點數 54
7.3 練習 55
第8章 循環 57
8.1 while循環 58
8.2 for循環 59
8.3 break 60
8.4 continue 61
8.5 do-while循環 62
第9章 地址與指針 67
9.1 獲取地址 67
9.2 用指針保存地址 68
9.3 通過地址訪問數據 69
9.4 不同類型的數據所占用的字節大小 70
9.5 NULL 71
9.6 指針聲明的代碼規範 72
第10章 通過引用傳遞 73
10.1 編寫通過引用傳遞參數的函數 74
10.2 不要對NULL取值 75
第11章 結構 77
第12章 堆 81
第3部分 Objective-C與Foundation
第13章 對象 87
13.1 對象 87
13.2 類 87
13.3 創建並使用對象 88
13.4 方法和消息 90
13.5 消息發送 90
13.6 詳解消息 91
13.7 類方法與實例方法 92
13.8 發送錯誤消息 93
13.9 大小寫很重要! 94
13.10 Objective-C語言命名習慣 95
13.11 術語小簡介 96
第14章 再談消息 97
14.1 傳遞實參的消息 97
14.2 多個實參 98
14.3 消息的嵌套發送 100
14.4 alloc和init 100
14.5 嚮nil發送消息 101
14.6 id 102
第15章 對象與內存 105
15.1 指針和指針的值 105
15.2 內存管理 107
15.3 ARC 108
第16章 NSString 111
16.1 創建NSString實例 111
16.2 NSString方法 112
16.3 類參考 113
16.4 文檔的其他部分 117
16.5 練習:尋找更多的NSString方法 118
第17章 NSArray 119
17.1 創建數組 119
17.2 存取數組 120
17.3 遍曆數組 123
17.4 NSMutableArray 124
17.5 舊式數組方法 125
第18章 第一個自定義類 129
18.1 存取方法 132
18.2 存取方法的命名規範 133
18.3 self 134
18.4 多個實現文件 134
18.5 類前綴 135
第19章 屬性 137
19.1 聲明屬性 137
19.2 屬性的特性 139
19.3 用點號調用存取方法 140
第20章 繼承 141
20.1 覆蓋方法 144
20.2 Super 145
20.3 繼承層次 145
20.4 description方法和%@轉換說明 148
第21章 對象實例變量及屬性 151
21.1 對象所有權與ARC 153
21.2 創建BNRAsset類 154
21.3 為BNREmployee創建一對多關係 155
第22章 類擴展 161
22.1 隱藏可變屬性 162
22.2 頭文件與繼承 163
22.3 頭文件與生成的實例變量 164
第23章 避免內存泄露 165
23.1 強引用循環 167
23.2 弱引用 170
23.3 弱引用的自動置零特性 171
23.4 深入學習:手動引用計數和ARC曆史 173
第24章 Collection類 177
24.1 NSSet/NSMutableSet 177
24.2 NSDictionary/NSMutableDictionary 180
24.3 不可修改對象 183
24.4 數組排序 184
24.5 過濾 185
24.6 Collection對象與所有權 186
24.7 C語言基本類型 187
24.8 Collection對象與nil 187
第25章 常量 189
25.1 預處理指令 190
25.2 #include與#import 191
25.3 #define 192
25.4 全局變量 192
25.5 enum 194
25.6 比較#define與全局變量 195
第26章 通過NSString和NSData將數據寫入文件 197
26.1 將NSString對象寫入文件 197
26.2 NSError 198
26.3 通過NSString讀取文件 200
26.4 將NSData對象所保存的數據寫入文件 201
26.5 從文件讀取數據並存入NSData對象 202
26.6 尋找特彆目錄 203
第27章 迴調 205
27.1 運行循環 206
27.2 目標-動作對 206
27.3 輔助對象 208
27.4 通知 212
27.5 如何選擇 213
27.6 迴調與對象所有權 214
27.7 深入學習:選擇器的工作機製 215
第28章 Block對象 217
28.1 使用Block對象 218
28.2 Block對象 vs. 其他迴調 223
28.3 深入學習Block對象 223
第29章 協議 229
調用可選方法 231
第30章 Property List格式 233
第4部分 由事件驅動的應用
第31章 第一個iOS應用 239
31.1 基於圖形用戶界麵的應用 240
31.2 創建iTahDoodle 240
31.3 BNRAppDelegate 242
31.4 Model-View-Controller 243
31.5 應用委托對象 245
31.6 設置視圖 246
31.7 在模擬器中運行程序 248
31.8 為按鈕關聯動作方法 249
31.9 為UITableView對象提供數據 252
31.10 保存並加載數組 255
31.11 深入學習:main()的作用 258
31.12 深入學習:在真機上運行iTahDoole 258
第32章 第一個Cocoa應用 259
32.1 開始開發TahDoodle 260
32.2 在Interface Builder中設置視圖 262
32.3 創建關聯 270
32.4 實現NSTableViewDataSource 275
32.5 保存並加載數據 276
第5部分 Objective-C高級主題
第33章 init 281
33.1 編寫init方法 281
33.2 實現基本的init方法 282
33.3 instancetype類型 283
33.4 使用並檢查父類的初始化方法 283
33.5 帶實參的init方法 284
33.6 在init中使用存取方法 286
33.7 多個初始化方法 287
33.8 禁用init方法 290
第34章 再談屬性 291
34.1 再談屬性的特性 291
34.2 實現存取方法 294
第35章 KVC 297
第36章 KVO 301
36.1 在KVO中使用context 302
36.2 顯式觸發通知 303
36.3 獨立的屬性 303
第37章 範疇 305
第6部分 C語言高級主題
第38章 位運算 309
38.1 按位或 310
38.2 按位與 311
38.3 其他位運算符 313
38.4 用enum定義位掩碼 315
38.5 占用更多字節的整數類型 316
第39章 C字符串 317
39.1 char 317
39.2 char * 318
39.3 string literal 321
39.4 C字符串和NSString對象的相互轉換 322
39.5 練習 322
第40章 C數組 323
第41章 從命令行運行 329
41.1 命令行參數 330
41.2 命令行的簡便方式 333
第42章 Switch語句 335
附錄 Objective-C運行時 337
結束語 345
索引 347

前言/序言


Objective-C編程(第2版) 一、 踏上iOS開發的奇妙旅程 歡迎來到Objective-C的世界,這是一種強大而靈活的編程語言,是開發iOS、macOS、watchOS和tvOS應用程序的基石。無論您是初學者,渴望將創意轉化為觸手可及的應用程序,還是經驗豐富的開發者,希望深入理解Objective-C的精髓,本書都將是您不可或缺的嚮導。 Objective-C,作為Apple平颱開發的核心語言,其優雅的語法和動態的特性,賦予瞭開發者強大的能力去構建引人入勝、功能豐富且性能卓越的應用。本書旨在為您提供一個全麵、深入的學習體驗,讓您不僅能夠掌握Objective-C的語法和概念,更能深刻理解其設計哲學,從而更高效、更創造性地進行Apple生態係統的應用開發。 本書的獨特之處在於其循序漸進的學習路徑,從最基礎的編程概念入手,逐步引導您掌握Objective-C的核心特性。我們不隻是羅列語法規則,更注重解釋“為何如此”,讓您理解語言背後的設計思想,從而能夠融會貫通,觸類旁通。 您將在這本書中學到什麼? Objective-C基礎: 從類、對象、方法到屬性、繼承和多態,我們將逐一剖析Objective-C的核心概念,確保您構建起堅實的基礎。 Cocoa Touch框架: iOS開發離不開強大的Cocoa Touch框架。本書將深入講解Foundation框架,這是構建所有Cocoa應用程序的基礎,並為您揭示UIKit框架的奧秘,讓您能夠設計和實現用戶界麵,處理用戶交互。 內存管理: 自動引用計數(ARC)是Objective-C現代內存管理的核心。我們將詳細講解ARC的工作原理,以及如何編寫高效、無內存泄漏的代碼。 塊(Blocks): Blocks是Objective-C中一種強大的代碼組織和傳遞機製,在處理異步操作、迴調等場景中至關重要。本書將深入講解Blocks的語法、用法和高級特性。 Objective-C運行時: Objective-C的動態特性是其強大之處。我們將探索Objective-C運行時(Runtime)的工作機製,理解消息傳遞、動態綁定等概念,這將極大地開闊您的編程視野。 麵嚮協議的編程: 協議(Protocols)在Objective-C中扮演著至關重要的角色,它們定義瞭對象之間的接口,是實現代碼復用和解耦的關鍵。本書將深入講解協議的設計和應用。 常用的Cocoa框架: 除瞭Foundation和UIKit,我們還將介紹一些常用的Cocoa框架,如Core Data(數據持久化)、Core Animation(動畫效果)、Networking(網絡通信)等,幫助您構建更完整的應用。 實際項目演練: 理論結閤實踐是學習的關鍵。本書將穿插多個實際項目的案例,引導您將所學知識應用於實際開發中,從而鞏固理解,提升實戰能力。 本書的目標讀者 初學者: 對iOS或macOS開發感興趣,希望從零開始學習Objective-C編程語言的開發者。 轉行開發者: 來自其他編程語言背景,希望掌握Objective-C以進入Apple生態係統開發的開發者。 現有iOS開發者: 希望深化對Objective-C的理解,掌握更高級的特性和最佳實踐的開發者。 計算機科學專業學生: 希望係統學習麵嚮對象編程和Apple平颱開發的專業學生。 為何選擇Objective-C? 盡管Swift已成為Apple平颱開發的首選語言,但Objective-C依然在龐大的現有項目中扮演著舉足輕重的角色。許多成熟的應用程序和框架仍然使用Objective-C編寫,深入理解Objective-C將使您能夠更好地維護和擴展這些項目,並在招聘市場上保持競爭力。更重要的是,Objective-C的動態特性和運行時機製,為理解現代編程語言的設計提供瞭寶貴的視角。 準備好迎接挑戰瞭嗎? 本書將引導您一步步深入Objective-C的殿堂。我們相信,通過細緻的講解、豐富的示例和循序漸進的練習,您將能夠熟練掌握Objective-C,並充滿信心地開啓您的Apple平颱開發之旅。讓我們一同探索Objective-C的無限可能! --- 二、 Objective-C的基石:語法與核心概念 在踏上Objective-C的編程之旅之前,我們首先需要熟悉它的基本語法和核心概念。Objective-C是一門麵嚮對象的編程語言,它在C語言的基礎上添加瞭Smalltalk的消息傳遞機製,這賦予瞭它獨特的動態特性和強大的靈活性。 1. 類(Classes)與對象(Objects) 在麵嚮對象編程中,類是創建對象的藍圖,而對象則是類的實例。 類的聲明(Declaration): 類的聲明通常定義在`.h`(頭文件)中,它描述瞭類的屬性(成員變量)和方法(成員函數)。 ```objectivec // MyClass.h import @interface MyClass : NSObject // MyClass繼承自NSObject { // 實例變量(通常在.m文件中定義) } // 屬性聲明 @property (nonatomic, strong) NSString propertyName; // 方法聲明 - (void)instanceMethod; // 實例方法 + (void)classMethod; // 類方法 @end ``` `@interface`:聲明一個類的開始。 `:`:錶示類的繼承關係,`MyClass`繼承自`NSObject`。 `@property`:用於聲明屬性,它會自動生成getter和setter方法。`nonatomic`錶示非原子性操作,`strong`錶示強引用。 `-`:錶示實例方法,方法名前的`-`錶示這是一個實例方法。 `+`:錶示類方法,方法名前的`+`錶示這是一個類方法。 `(...)`:方法返迴值類型和參數類型。 類的實現(Implementation): 類的實現通常定義在`.m`(源文件)中,它包含瞭方法的具體實現。 ```objectivec // MyClass.m import "MyClass.h" @implementation MyClass // 實例變量的定義(在@implementation塊內) @synthesize propertyName = _propertyName; // @synthesize可用於顯式生成getter/setter,ARC下通常不需要 - (instancetype)init { self = [super init]; if (self) { // 初始化代碼 _propertyName = @"Default Value"; } return self; } - (void)instanceMethod { NSLog(@"This is an instance method."); NSLog(@"Property value: %@", self.propertyName); } + (void)classMethod { NSLog(@"This is a class method."); } @end ``` `@implementation`:聲明一個類的實現。 `@synthesize`:顯式地為屬性生成getter和setter方法,並在實例變量列錶中生成一個同名的實例變量(或指定一個不同的名字,如`_propertyName`)。在ARC環境下,對於大多數情況,編譯器會自動處理屬性的閤成。 `- (instancetype)init`:這是類的初始化方法,通常用於為實例變量賦初值。`instancetype`是一種更安全的返迴類型,錶示返迴的是當前類的實例。 `self`:在實例方法中,`self`指嚮當前對象。在類方法中,`self`指嚮當前類。 創建對象(Instantiation): 使用`alloc`和`init`方法來創建類的實例。 ```objectivec // 在其他文件中使用MyClass import "MyClass.h" int main(int argc, const char argv[]) { @autoreleasepool { // 創建MyClass對象 MyClass myObject = [[MyClass alloc] init]; // 調用實例方法 [myObject instanceMethod]; // 設置屬性 myObject.propertyName = @"New Value"; NSLog(@"Updated property: %@", myObject.propertyName); // 調用類方法 [MyClass classMethod]; } return 0; } ``` `[[MyClass alloc] init]`:這是Objective-C創建對象的標準模式。`alloc`負責在內存中分配對象所需的空間,`init`負責對對象進行初始化。 `[receiver message]`:這是Objective-C中發送消息的語法。`receiver`是消息的接收者(對象或類),`message`是要執行的方法名(帶參數)。 2. 消息傳遞(Message Passing) Objective-C的核心是消息傳遞。當您調用一個方法時,實際上是嚮一個對象發送瞭一條消息。接收者對象根據收到的消息在運行時決定執行哪個方法。這賦予瞭Objective-C高度的動態性。 3. Foundation框架 Foundation框架提供瞭Objective-C語言的核心功能,包括對象管理、集閤類、字符串處理、日期時間、文件操作、網絡通信等。 `NSObject`: 幾乎所有Objective-C對象都繼承自`NSObject`,它是所有類的根類。它提供瞭對象的基本行為,如初始化、內存管理、屬性訪問等。 `NSString`: 用於錶示不可變字符串。 ```objectivec NSString greeting = @"Hello, "; NSString name = @"World!"; NSString message = [NSString stringWithFormat:@"%@%@", greeting, name]; NSLog(@"%@", message); // 輸齣: Hello, World! ``` 集閤類: `NSArray`:有序的不可變對象集閤。 `NSMutableArray`:有序的可變對象集閤。 `NSDictionary`:鍵值對的無序集閤。 `NSMutableDictionary`:可變的鍵值對集閤。 `NSSet`:無序的唯一對象集閤。 `NSMutableSet`:可變的唯一對象集閤。 4. 內存管理(ARC) 在現代Objective-C開發中,自動引用計數(ARC)是默認的內存管理機製。ARC會自動插入內存管理代碼,開發者無需手動管理對象的生命周期。 引用計數: 每個對象都有一個引用計數器。當對象的引用計數大於0時,對象會被保留在內存中。當引用計數變為0時,對象會被銷毀。 `strong`: 錶示強引用。被強引用的對象不會被銷毀。 `weak`: 錶示弱引用。被弱引用的對象不會阻止其被銷毀。當被弱引用的對象銷毀時,弱引用會自動變為`nil`。 `assign`: 通常用於基本數據類型(如`int`、`float`)和C數據類型(如`struct`)的屬性。 `nonatomic` vs `atomic`: `nonatomic`錶示非原子性,操作效率更高。`atomic`錶示原子性,保證瞭綫程安全,但效率較低。 5. 控製流與數據類型 條件語句: `if-else`、`switch` 循環語句: `for`、`while`、`do-while`、`for-in`(用於遍曆集閤) 基本數據類型: `int`、`float`、`double`、`BOOL`、`char`等。 `NSInteger` 和 `NSUInteger`: Foundation框架提供的整數類型,其大小會根據目標平颱(32位或64位)自動調整。 6. 塊(Blocks) 塊(Blocks)是Objective-C中一種匿名函數,可以作為參數傳遞、存儲在變量中,並且可以捕獲其外部的變量。 ```objectivec // 聲明一個塊變量 int multiplier = 5; int (^myBlock)(int) = ^(int num) { return num multiplier; // 捕獲外部變量multiplier }; // 調用塊 int result = myBlock(10); // result will be 50 NSLog(@"Result: %d", result); ``` `^`:錶示塊的開始。 `(int)`:塊的返迴值類型。 `(int num)`:塊的參數列錶。 `{ return num multiplier; }`:塊的實現代碼。 7. 協議(Protocols) 協議定義瞭一組方法和屬性,任何類都可以通過實現協議來錶明它具備瞭協議中定義的功能。 ```objectivec // 定義一個協議 @protocol MyProtocol @required // 必須實現的方法 - (void)requiredMethod; @optional // 可選實現的方法 - (void)optionalMethod; @end // 一個類遵循協議 @interface MyImplementingClass : NSObject @end @implementation MyImplementingClass - (void)requiredMethod { NSLog(@"Implementing requiredMethod"); } // - (void)optionalMethod // 可選實現 @end ``` `@protocol`:聲明一個協議。 ``:錶示該協議也繼承自`NSObject`。 `@required`:錶示以下聲明的方法必須被遵循協議的類實現。 `@optional`:錶示以下聲明的方法可以被選擇性地實現。 ``:在類的聲明中,用尖括號錶示該類遵循瞭`MyProtocol`協議。 理解瞭這些基本語法和概念,您就為進一步深入Objective-C的世界打下瞭堅實的基礎。接下來,我們將探索Objective-C的麵嚮對象特性,以及如何利用這些特性來構建復雜的應用程序。 --- 三、 麵嚮對象設計:類、繼承、多態與封裝 Objective-C作為一門麵嚮對象的編程語言,其核心在於對象、類、繼承、多態和封裝這些麵嚮對象的編程(OOP)原則。理解並熟練運用這些原則,是編寫齣清晰、可維護、可擴展代碼的關鍵。 1. 封裝(Encapsulation) 封裝是將數據(屬性)和操作數據的方法(行為)捆綁在一起,形成一個獨立的單元(類)。它隱藏瞭對象的內部實現細節,隻嚮外部暴露必要的接口。 私有屬性和方法: 在Objective-C中,可以通過將實例變量聲明在`.m`文件的`@interface`的匿名類彆(Anonymous Category)或在`.m`文件頂部的私有聲明來隱藏它們,使其無法從類的外部訪問。 ```objectivec // MyClass.h import @interface MyClass : NSObject @property (nonatomic, strong) NSString publicProperty; - (void)publicMethod; @end // MyClass.m import "MyClass.h" // 匿名類彆,用於私有聲明 @interface MyClass () @property (nonatomic, strong) NSString privateProperty; - (void)privateMethod; @end @implementation MyClass // @synthesize privateProperty = _privateProperty; // ARC下通常不需要 - (instancetype)init { self = [super init]; if (self) { _privateProperty = @"This is private"; _publicProperty = @"This is public"; } return self; } - (void)publicMethod { NSLog(@"Public method called."); [self privateMethod]; // 內部可以調用私有方法 } - (void)privateMethod { NSLog(@"Private method called. Private property: %@", self.privateProperty); } @end ``` 通過這種方式,`privateProperty`和`privateMethod`隻能在`MyClass`的內部被訪問,起到瞭封裝的作用。 屬性(Properties): `@property`指令是Objective-C實現封裝的有力工具。它自動生成getter和setter方法,允許您在訪問或修改屬性時進行額外的邏輯處理(例如,驗證、通知等)。 2. 繼承(Inheritance) 繼承允許一個類(子類)繼承另一個類(父類)的屬性和方法。這促進瞭代碼的重用,並建立瞭“is-a”關係。 單繼承: Objective-C隻支持單繼承,即一個類隻能直接繼承自一個父類。 ```objectivec // Animal.h @interface Animal : NSObject - (void)eat; @end // Dog.h import "Animal.h" @interface Dog : Animal // Dog繼承自Animal - (void)bark; @end // Animal.m @implementation Animal - (void)eat { NSLog(@"Animal is eating."); } @end // Dog.m @implementation Dog - (void)bark { NSLog(@"Woof!"); } // Dog 自動繼承瞭 Animal 的 eat 方法 @end // 使用 Dog myDog = [[Dog alloc] init]; [myDog eat]; // 輸齣: Animal is eating. [myDog bark]; // 輸齣: Woof! ``` 方法重寫(Method Overriding): 子類可以提供父類方法的不同實現。 ```objectivec // Shape.h @interface Shape : NSObject - (void)draw; @end // Circle.h import "Shape.h" @interface Circle : Shape @end // Shape.m @implementation Shape - (void)draw { NSLog(@"Drawing a generic shape."); } @end // Circle.m @implementation Circle - (void)draw { // 重寫draw方法 NSLog(@"Drawing a circle."); } @end // 使用 Shape shape = [[Shape alloc] init]; [shape draw]; // 輸齣: Drawing a generic shape. Circle circle = [[Circle alloc] init]; [circle draw]; // 輸齣: Drawing a circle. ``` `super` 關鍵字: 在子類中,可以使用`super`關鍵字來調用父類的方法。這在重寫方法時非常有用,可以在調用子類自己的實現之前或之後執行父類的邏輯。 ```objectivec @implementation Circle - (instancetype)init { self = [super init]; // 調用父類的初始化方法 if (self) { // Circle 特有的初始化 } return self; } - (void)draw { [super draw]; // 調用父類的draw方法 NSLog(@"Additionally, drawing the circle's outline."); } @end ``` 3. 多態(Polymorphism) 多態允許您使用父類類型的引用指嚮子類對象,並在運行時動態地調用正確的方法。這提高瞭代碼的靈活性和可擴展性。 麵嚮協議的多態: 結閤協議,可以實現更靈活的多態。 ```objectivec @protocol Playable - (void)play; @end @interface Guitar : NSObject @end @implementation Guitar - (void)play { NSLog(@"Playing guitar..."); } @end @interface Piano : NSObject @end @implementation Piano - (void)play { NSLog(@"Playing piano..."); } @end // 任何遵循 Playable 協議的對象都可以被 treat as Playable id instrument = [[Guitar alloc] init]; [instrument play]; // 輸齣: Playing guitar... instrument = [[Piano alloc] init]; [instrument play]; // 輸齣: Playing piano... ``` 這裏,`instrument`可以指嚮任何遵循`Playable`協議的對象。當我們調用`[instrument play]`時,Objective-C運行時會根據`instrument`實際指嚮的對象(`Guitar`或`Piano`)來執行相應的方法。 4. 消息傳遞與運行時(Runtime) Objective-C的消息傳遞機製是多態的關鍵。當發送消息時,Objective-C運行時會查找接收者對象的類,並確定執行哪個方法。這是一種動態聯編(Dynamic Binding),與靜態聯編(Static Binding)(如C++中)不同,後者在編譯時就確定瞭方法的調用。 動態類型: `id`類型是一個通用對象類型,可以指嚮任何Objective-C對象。 ```objectivec id myObject = [[NSString alloc] initWithString:@"Hello"]; NSLog(@"%@", myObject); // 輸齣: Hello myObject = [[NSArray alloc] initWithObjects:@"a", @"b", nil]; NSLog(@"%@", myObject); // 輸齣: ( a, b ) ``` `id`類型的使用體現瞭Objective-C的動態性,但也可能犧牲一些編譯時的類型檢查,需要開發者更加謹慎。 5. 構造器(Constructors)與初始化 在Objective-C中,類的初始化通常通過`init`係列方法來完成。 `init`: 類的默認初始化方法。 自定義初始化方法: 通常遵循`initWith...`的命名約定,用於在創建對象時設置特定的屬性。 ```objectivec @interface Person : NSObject @property (nonatomic, strong) NSString name; @property (nonatomic, assign) NSInteger age; @end @implementation Person - (instancetype)init { self = [super init]; if (self) { // 默認值 _name = @"Unknown"; _age = 0; } return self; } - (instancetype)initWithName:(NSString )name age:(NSInteger)age { self = [super init]; if (self) { _name = [name copy]; // 使用copy確保字符串的獨立性 _age = age; } return self; } @end // 使用 Person person1 = [[Person alloc] init]; // 使用默認初始化 Person person2 = [[Person alloc] initWithName:@"Alice" age:30]; // 使用自定義初始化 ``` 6. 抽象(Abstraction) 抽象是通過協議和繼承來隱藏不必要的細節,隻暴露必要的功能。例如,您可以通過一個`Shape`協議來定義一個通用的圖形繪製接口,而無需關心具體的圖形是如何繪製的。 通過深入理解和實踐這些麵嚮對象的設計原則,您將能夠更好地組織您的代碼,創建更健壯、易於維護和擴展的Objective-C應用程序。這為構建復雜的iOS和macOS應用奠定瞭堅實的基礎。 --- 四、 Cocoa Touch框架:iOS應用開發的基石 Objective-C的強大能力在與Apple的Cocoa Touch框架相結閤時得以充分釋放,尤其是在iOS設備上。Cocoa Touch是構建所有iOS應用程序的軟件開發工具包,它提供瞭一係列核心框架,使開發者能夠創建用戶界麵、管理數據、處理用戶輸入、網絡通信等等。 1. Foundation框架:編程的基礎 Foundation框架是Cocoa Touch的基石,它提供瞭Objective-C語言運行所需的基礎類和功能。 數據類型: `NSString`: 處理不可變字符串。 `NSArray` / `NSMutableArray`: 存儲有序的對象集閤。 `NSDictionary` / `NSMutableDictionary`: 存儲鍵值對。 `NSSet` / `NSMutableSet`: 存儲唯一對象。 `NSNumber`: 包裝基本數據類型(如`int`、`float`)以便它們能夠被存儲在集閤中。 `NSDate`: 錶示日期和時間。 `NSData`: 錶示原始字節數據。 內存管理: Foundation框架支持Objective-C的內存管理機製。在現代開發中,ARC(Automatic Reference Counting)是主要的內存管理方式。 其他核心功能: 文件I/O: 讀寫文件。 網絡: 基礎的網絡通信功能。 綫程與並發: 簡單的綫程管理。 2. UIKit框架:構建用戶界麵 UIKit框架是iOS應用程序用戶界麵的核心。它提供瞭構建UI元素、響應用戶交互以及管理應用生命周期所需的一切。 視圖(Views): `UIView`: 屏幕上所有可視化元素的基類。您可以創建自定義視圖來繪製圖形、顯示內容等。 `UILabel`: 顯示文本。 `UIImageView`: 顯示圖像。 `UIButton`: 提供可點擊的按鈕。 `UITextField` / `UITextView`: 用戶輸入的文本控件。 `UITableView` / `UICollectionView`: 顯示可滾動的列錶或網格數據。 視圖控製器(View Controllers): `UIViewController`: 管理一個視圖層次結構(View Hierarchy)及其相關的邏輯。每個屏幕或頁麵通常由一個視圖控製器管理。 視圖控製器生命周期: `viewDidLoad`、`viewWillAppear`、`viewDidAppear`、`viewWillDisappear`、`viewDidDisappear`等方法,它們在視圖控製器被創建、顯示、消失時被調用,用於進行相應的初始化、資源加載和清理。 事件處理(Event Handling): Target-Action模式: 這是iOS中處理用戶交互(如按鈕點擊)的主要模式。您將一個控件(Target)與一個方法(Action)關聯起來,當控件發生特定事件時,會自動調用該方法。 手勢識彆(Gesture Recognizers): `UITapGestureRecognizer`、`UIPanGestureRecognizer`、`UISwipeGestureRecognizer`、`UIRotationGestureRecognizer`、`UIPinchGestureRecognizer`等,用於識彆更復雜的用戶手勢。 應用程序生命周期(Application Lifecycle): `UIApplication`: 應用的主對象,管理應用的全局行為和事件。 `AppDelegate`: 一個關鍵的協議,定義瞭應用生命周期中的關鍵事件的迴調方法,例如: `application:didFinishLaunchingWithOptions:`:應用啓動時調用。 `applicationWillEnterForeground:`:應用即將進入前颱時調用。 `applicationDidBecomeActive:`:應用激活時調用。 `applicationWillResignActive:`:應用即將失去激活時調用。 `applicationDidEnterBackground:`:應用進入後颱時調用。 `applicationWillTerminate:`:應用即將終止時調用。 視圖控製器轉場(View Controller Transitions): 模態呈現(Modal Presentation): 使用`presentViewController:animated:completion:`方法,將一個視圖控製器以模態的方式覆蓋在當前視圖控製器之上。 導航控製器(`UINavigationController`): 提供瞭一種堆棧式的導航方式,允許用戶在多個屏幕之間來迴切換。`pushViewController:animated:`和`popViewControllerAnimated:`是其核心方法。 標簽控製器(`UITabBarController`): 提供瞭一個底部標簽欄,允許用戶在多個不同的視圖控製器之間切換。 3. Core Data:數據持久化 Core Data是一個強大的框架,用於管理應用程序的數據模型和持久化。它允許您以麵嚮對象的方式來存儲、檢索和管理數據,而無需直接處理底層數據庫(如SQLite)。 核心概念: Managed Object Model (MOM): 定義瞭您應用程序的數據結構,包括實體(Entities)、屬性(Attributes)和關係(Relationships)。 Managed Object Context (MOC): 用於追蹤對象的變化,並將其持久化到存儲協調器。可以看作是內存中的一個“暫存區”。 Persistent Store Coordinator (PSC): 管理與數據存儲(如SQLite數據庫文件)的交互。 Persistent Store: 實際存儲數據的載體,可以是SQLite文件、二進製文件或內存。 4. Core Animation:流暢的動畫效果 Core Animation框架提供瞭創建平滑、高性能動畫的機製。 `CALayer`: 動畫和視覺效果的基本單元。`UIView`本身就有一個關聯的`CALayer`。 `CAAnimation`: 動畫的基類,包括`CABasicAnimation`(基本動畫)、`CAKeyframeAnimation`(關鍵幀動畫)、`CAAnimationGroup`(動畫組)等。 Spring Animation: 使用`CASpringAnimation`可以創建逼真的彈簧動畫效果。 5. Networking:網絡通信 `URLSession`: iOS中進行網絡通信的標準API,用於發送HTTP請求、下載文件、上傳數據等。 `AFNetworking` / `Alamofire`: 第三方庫,提供瞭更高級、更便捷的網絡請求封裝。 6. 後颱任務與推送通知 後颱執行: iOS允許應用在後颱執行一些任務,例如播放音樂、同步數據等。 本地通知與遠程通知: `UserNotifications`框架允許您發送本地通知和接收來自服務器的遠程(推送)通知,與用戶進行異步交互。 7. 其他重要框架 MapKit: 集成地圖功能。 AVFoundation: 音頻和視頻處理。 Core Graphics: 用於繪製2D圖形。 StoreKit: 處理應用內購買。 掌握Cocoa Touch框架是進行iOS開發的核心。本書將通過實際的示例和代碼演示,幫助您理解這些框架的用法,並運用它們來構建功能豐富、用戶體驗齣色的iOS應用程序。 --- 五、 Objective-C的進階之路:高級特性與最佳實踐 在掌握瞭Objective-C的基礎語法、麵嚮對象原則以及Cocoa Touch框架的核心組件之後,我們將進一步深入探索Objective-C的一些高級特性,這些特性將幫助您編寫齣更高效、更具擴展性、更易於維護的代碼,並理解Objective-C在運行時更為精妙的機製。 1. Objective-C運行時(Runtime)的深度探索 Objective-C的動態特性很大程度上依賴於其強大的運行時係統。理解運行時機製,能夠幫助您更深入地理解Objective-C的工作方式,甚至進行一些元編程(Metaprogramming)操作。 消息轉發(Message Forwarding): 當一個對象接收到它無法處理的消息時,運行時係統會嘗試進行消息轉發。 `resolveInstanceMethod:` / `resolveClassMethod:`: 允許您動態地添加方法實現。 `forwardingTargetForSelector:`: 允許您將消息轉發給另一個對象。 `methodSignatureForSelector:` 和 `forwardInvocation:`: 提供更精細的消息轉發控製,允許您創建一個方法簽名並手動調用它。 動態方法解析(Dynamic Method Resolution): 通過實現`resolveInstanceMethod:`或`resolveClassMethod:`,可以在方法調用時動態地為類添加方法實現。這在一些框架(如KVC/KVO)中扮演著重要角色。 方法簽名(Method Signature): `NSMethodSignature`對象描述瞭方法的返迴類型和參數類型。 調用目標(Invocation Target): `NSInvocation`對象代錶瞭一個方法調用,它包含瞭接收者、方法選擇器(Selector)以及方法的參數。 `Method Swizzling`(方法交換): 這是一種強大的技術,可以在運行時動態地替換方法的實現。常用於AOP(Aspect-Oriented Programming)、插樁(Instrumentation)或在不修改原有代碼的情況下添加額外的行為。 ```objectivec import // 假設我們有一個方法叫做 originalMethod // Method Swizzling 的實現(在某個類的load方法中調用) SEL originalSelector = @selector(originalMethod); SEL swizzledSelector = @selector(swizzledMethod); Method originalMethod = class_getInstanceMethod([MyClass class], originalSelector); Method swizzledMethod = class_getInstanceMethod([MyClass class], swizzledSelector); // 交換方法實現 method_exchangeImplementations(originalMethod, swizzledMethod); // 現在調用 originalMethod 會執行 swizzledMethod 的邏輯,反之亦然。 ``` `class_getInstanceMethod`:獲取實例方法的`Method`結構體。 `method_exchangeImplementations`:交換兩個方法的實現。 2. Blocks 的高級用法 Blocks在Objective-C中扮演著至關重要的角色,尤其是在處理異步操作、迴調和鏈式調用時。 捕獲變量的範圍: `__strong`: 默認行為,對捕獲的`strong`引用對象增加引用計數,保持其生命周期。 `__weak`: 捕獲對象為弱引用,避免循環引用。在處理異步操作時非常重要,以防止對象在block執行完成前被釋放。 `__unsafe_unretained`: 類似於`weak`,但不進行自動置nil,使用時需要注意。 `__block`: 允許在block內部修改外部變量。當使用`__block`修飾對象時,它會創建一個`__block`變量的包裝對象,使得block可以修改外部變量的指嚮,而不是直接修改對象本身。 ```objectivec __block NSString mutableString = [NSString stringWithString:@"Initial"]; dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(2 NSEC_PER_SEC)), dispatch_get_main_queue(), ^{ mutableString = @"Changed after delay"; // 使用__block可以修改外部變量 NSLog(@"Inside block: %@", mutableString); }); ``` Blocks 作為迴調: 廣泛用於異步操作,如網絡請求、文件下載、定時器等。 Blocks 作為方法參數: 許多Cocoa框架的方法都接受Blocks作為參數,用於執行特定的操作,例如`enumerateObjectsUsingBlock:`。 3. 協議(Protocols)的深入應用 協議是Objective-C實現接口和多態的重要機製。 協議擴展(Protocol Extensions): Swift引入瞭協議擴展,Objective-C中沒有直接的等價物,但可以通過匿名類彆(Anonymous Category)和分類(Category)實現類似的效果。 `@optional` 和 `@required`: 明確方法的必選與可選性。 協議的組閤(Protocol Composition): 使用`&`符閤來組閤多個協議,錶示一個對象必須同時遵循多個協議。 ```objectivec // 假設有 Playable 和 Recordable 兩個協議 id device; ``` Objective-C Runtime 對協議的支持: 運行時可以查詢一個類是否遵循瞭某個協議 (`conformsToProtocol:`),以及是否實現瞭某個方法 (`respondsToSelector:`)。 4. 內存管理的高級主題 盡管ARC大大簡化瞭內存管理,但理解其工作原理以及如何處理特殊情況仍然很重要。 循環引用(Retain Cycles): 當兩個或多個對象相互持有強引用,導緻它們都無法被釋放時,就會發生循環引用。 解決方案: 使用`__weak`修飾符打破循環引用。在block中,通常會弱引用`self`。 ```objectivec __weak typeof(self) weakSelf = self; [someObject performAsyncOperationWithCompletionHandler:^{ // 在block內部使用 weakSelf [weakSelf updateUI]; }]; ``` `@autoreleasepool`: 在ARC之前,`@autoreleasepool`用於管理自動釋放池。即使在ARC環境下,某些場景下(如內存密集型循環)手動創建`@autoreleasepool`塊仍然可以幫助優化內存使用。 5. GCD (Grand Central Dispatch) 與並發編程 GCD是Apple提供的強大的並發編程框架,它能夠簡化多綫程編程,管理任務的調度和執行。 Dispatch Queue: Serial Queues: 任務按順序執行,一次隻執行一個。 Concurrent Queues: 任務可以並發執行,但GCD會根據係統資源限製並發數量。 Main Queue: 專門用於在主綫程上執行UI更新等任務。 GCD 的常用方法: `dispatch_async()`:異步執行任務。 `dispatch_sync()`:同步執行任務。 `dispatch_once()`:確保某個代碼塊隻執行一次,常用於單例模式。 `dispatch_group_notify()`:在組內所有任務完成後執行通知。 6. 類彆(Categories)與分類(Categories) Categories: 允許您在不修改原始類定義的情況下,嚮現有類添加新的方法。它們可以用於組織代碼、添加輔助方法,或者在運行時“注入”行為。 ```objectivec // NSString+MyAdditions.h @interface NSString (MyAdditions) - (BOOL)isPureInt; @end // NSString+MyAdditions.m @implementation NSString (MyAdditions) - (BOOL)isPureInt { NSScanner scan = [NSScanner scannerWithString:self]; int value; return [scan scanInt:&value] && [scan isAtEnd]; } @end // 使用 NSString str = @"12345"; if ([str isPureInt]) { NSLog(@"It's an integer."); } ``` 注意: Categories不能添加新的實例變量,也不能重寫實例變量。 匿名類彆(Anonymous Categories): 如前所述,在`.m`文件中定義的無名稱的Category,用於私有方法的聲明。 7. 最佳實踐與設計模式 MVC (Model-View-Controller): iOS開發中最經典和常用的架構模式。 MVVM (Model-View-ViewModel): 另一種流行的架構模式,尤其在Apple平颱外的其他UI開發中更常見,但在iOS中也有廣泛應用。 Delegate 模式: 用於對象之間的通信,一個對象(Delegate)可以代錶另一個對象(Sender)來處理某些事件或提供數據。 Notification Center: 用於對象之間的廣播式通信,一個對象發送通知,其他感興趣的對象可以注冊接收。 KVC (Key-Value Coding) 和 KVO (Key-Value Observing): KVC允許您通過字符串鍵來訪問對象的屬性,KVO允許您觀察對象的屬性變化。 通過深入學習和實踐這些高級主題和最佳實踐,您將能夠編寫齣更加健壯、高效且易於維護的Objective-C代碼,並為構建復雜的、高質量的Apple平颱應用程序打下堅實的基礎。

用戶評價

評分

這本《Objective-C編程(第2版)》對我來說,真是一場意外的驚喜。我一直對iOS開發充滿興趣,但總覺得Objective-C這門語言有點“老派”,擔心學習起來會遇到很多障礙。然而,這本書以一種極其接地氣的方式,將Objective-C的方方麵麵都娓娓道來。它並沒有一開始就拋齣大量晦澀的概念,而是循序漸進,從最基礎的語法,到對象、類、繼承、多態等核心概念,都通過生動形象的比喻和貼近實際的例子進行講解。我尤其喜歡書中對內存管理部分的深入剖析,ARC(Automatic Reference Counting)的齣現大大簡化瞭Objective-C的內存管理,而這本書恰恰能夠幫助我理解ARC背後的原理,以及如何在這種自動管理下寫齣更健壯的代碼。書中穿插的許多代碼片段,都經過精心設計,不僅能夠演示某個知識點,更重要的是,它們結構清晰,易於理解和模仿。讀完一章,我總能迫不及待地想動手實踐,書中的練習題也恰到好處地鞏固瞭我的理解。它讓Objective-C不再是冰冷的符號,而是變成瞭一個可以與之對話、共同創造的工具。

評分

對於我這樣一名基礎相對薄弱的學習者來說,《Objective-C編程(第2版)》簡直是一劑“強心針”。這本書在講解Objective-C的各種特性時,都非常注重基礎概念的鋪墊。比如,在講解到對象和類的時候,它會先從最基本的變量和數據類型講起,然後逐步引入類的概念,再到對象的創建和使用。這種循序漸進的方式,讓我感覺每一步都走得很紮實,不會因為前麵某個概念沒理解而影響後續的學習。特彆是書中對Objective-C消息傳遞機製的講解,采用瞭非常直觀的圖示和比喻,讓我很容易就理解瞭消息是如何在對象之間傳遞的,以及這個過程中涉及到的方法查找過程。此外,對於Objective-C特有的自動引用計數(ARC)的介紹,也做得非常細緻,不僅說明瞭如何使用,更深入解釋瞭ARC的工作原理,讓我能夠更好地理解內存管理,寫齣更安全的代碼。這本書的語言風格也很親切,沒有使用過多晦澀難懂的術語,讓我在學習過程中始終保持輕鬆愉悅的心情。

評分

這本書《Objective-C編程(第2版)》簡直是為我量身定製的學習材料。作為一名從其他編程語言轉過來的開發者,我一直對Objective-C的麵嚮對象模型感到有些陌生。但這本書的講解方式非常巧妙,它將Objective-C的類、對象、實例變量、方法等概念,與我熟悉的模型進行類比,讓我能夠快速建立起直觀的理解。書中對Objective-C特有的消息傳遞機製(Message Passing)的解釋,用瞭很多生動的類比,比如“電話找人”的比喻,非常形象地說明瞭消息是如何被目標對象接收和處理的。這讓我擺脫瞭過去死記硬背的睏境,而是真正理解瞭其背後的運作原理。而且,書中針對Objective-C的內存管理(ARC)也給齣瞭非常清晰的指導,讓我能夠避免常見的內存泄漏和野指針問題。即使是像`@property`、`@synthesize`這樣看似簡單的關鍵字,書中也挖掘齣瞭它們背後的機製,讓我瞭解瞭它們是如何工作的。整本書讀下來,感覺自己對Objective-C的理解不再是停留在錶麵,而是有瞭更深入的認識,為我後續的iOS開發打下瞭堅實的基礎。

評分

我一直認為,一本好的技術書籍,不僅僅是羅列知識點,更重要的是能激發起讀者的學習熱情和獨立思考的能力。《Objective-C編程(第2版)》恰恰做到瞭這一點。在閱讀過程中,我感覺自己像是在和作者進行一場深入的對話,他提齣的問題、給齣的示例,都引導我不斷去思考“為什麼是這樣?”、“有沒有更好的方式?”。書中對Objective-C的運行時特性(Runtime)的講解,尤其讓我印象深刻。它讓我瞭解到Objective-C並非一門靜態的語言,而是可以在運行時進行動態地修改和擴展,這為iOS開發帶來瞭極大的靈活性。書中對於Objective-C的協議(Protocols)和分類(Categories)的介紹,也讓我看到瞭Objective-C在設計模式上的巧妙運用,比如如何通過協議實現接口,如何通過分類在不修改原有類的情況下增加新功能。這些知識點並非枯燥的概念,而是通過大量的實際代碼示例來體現,讓我能夠立刻看到這些設計思想的應用價值。這本書讓我感覺自己不僅僅是在學習一門編程語言,更是在學習一種思考問題和解決問題的方式。

評分

說實話,剛拿到《Objective-C編程(第2版)》時,我並沒有抱太高的期望,畢竟市麵上關於Objective-C的書籍並不少。然而,這本書的深度和廣度徹底顛覆瞭我的看法。它不僅僅是停留在基礎語法的介紹,而是深入到Objective-C語言設計的哲學層麵。作者在解釋一些高級概念時,比如消息傳遞機製、運行時特性(Runtime Features)等方麵,展現瞭紮實的功底和清晰的邏輯。我特彆欣賞書中關於Protocol(協議)和Category(類彆)的章節,它們是如何在Objective-C中實現更靈活的麵嚮對象設計的,書中都給齣瞭詳盡的解釋和實際的應用場景。此外,對於Block(塊)的講解,也做得相當到位,不僅說明瞭它的語法,更重要的是闡述瞭它在異步編程、迴調等場景下的強大作用,這對於實際開發至關重要。這本書的結構安排也很有條理,每一部分都承上啓下,讓我在學習過程中不容易迷失方嚮。它仿佛一位經驗豐富的導師,一步步引導我,讓我逐漸掌握Objective-C的精髓,甚至能夠開始思考如何編寫更具擴展性和維護性的代碼。

評分

很好的開發書,京東價格便宜

評分

書不錯!

評分

著者 李駿,邊思

評分

真的是麵嚮沒有任何語言基礎的人,從c語言開始講,比較貴

評分

送貨快 包裝好

評分

書本質量不錯,湊單買的

評分

很好的開發書,京東價格便宜

評分

係統的學習一下iOS的編程語言。

評分

都沒看。不適閤新手。沒基礎的人

相關圖書

本站所有內容均為互聯網搜尋引擎提供的公開搜索信息,本站不存儲任何數據與內容,任何內容與數據均與本站無關,如有需要請聯繫相關搜索引擎包括但不限於百度google,bing,sogou

© 2025 book.teaonline.club All Rights Reserved. 圖書大百科 版權所有