




已閱讀5頁,還剩15頁未讀, 繼續(xù)免費閱讀
版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
課程簡介.正如它的名字所傳達的含義,F(xiàn)oundation 框架是所有 iOS 和 Mac OS X 編程所使用的基本工具。要成為這兩個平臺上成功的開發(fā)者,必須對這套工具了如指掌。Foundation 框架定義了數量眾多的類以及協(xié)議,它們各司其職。但三種類和協(xié)議的地位更加突出,它們是最基本的部分: 根類和相關的協(xié)議。根類,即NSObject,還伴有一個同名的協(xié)議。它確定了所有 Objective-C 對象的基本接口和行為。同時也有一些協(xié)議,其他類可以采用這些協(xié)議來拷貝這些類的實例并對編碼它們的狀態(tài)。 數值類。數值類能夠產生一個實例(稱為數值對象),也就是將字符串、數字、日期、二進制數據等基本類型數據封裝起來的面向對象包裝。 群體類。群體類的一個實例(稱為群體)管理著一組對象。區(qū)分不同類型的群體就要看訪問它所包含的對象的方式是什么。通常,群體中包含的項目都是一系列數值對象。群體和數值對象是 Objective-C 編程中極其重要的內容,因為它們經常被用作方法的參數和返回值。課時:認識根類和Objective-C 對象摘要:在類繼承中,根類不從其他類繼承,同時所有其他的類都最終繼承自根類。NSObject 是 Objective-C 繼承中的根類。其他類都從 NSObject 繼承一套基本的接口到 Objectiv在類繼承中,根類不從其他類繼承,同時所有其他的類都最終繼承自根類。NSObject 是 Objective-C 繼承中的根類。其他類都從 NSObject 繼承一套基本的接口到 Objective-C 運行時體系中。這些類的實例又都是從 NSObject 繼承而獲得 Objective-C 最根本的特性。但就其自身而言,NSObject 的實例做不了什么有趣的事,頂多只是個對象而已。要使用更多屬性和邏輯來定制你的程序,就必須創(chuàng)造一個或多個繼承自 NSObject 的類,或者使用已有的直接或間接繼承自 NSObject 的類。NSObject 采用了 NSObject 的協(xié)議,它聲明了一些附加方法,可以被所有對象的接口使用。另外,NSObject.h(包含了 NSObject 類定義的頭文件)中包含 NSCopying、NSMutableCopying 和 NSCoding 協(xié)議。當某個類采用了這些協(xié)議后,它便獲得了對象拷貝和對象編碼的基本對象行為。模型類(封裝了應用數據并管理這些數據的實例的類)經常采用對象拷貝和對象編碼協(xié)議。NSObject 類和相關協(xié)議定義了創(chuàng)建對象、瀏覽繼承鏈、查閱對象的特征和功能、比較對象、拷貝對象和把對象進行編碼等的一系列方法。本文接下來主要講述的就是這類任務的基本要求。創(chuàng)建對象通常,創(chuàng)建對象時,要先為它分配內存,然后將它初始化。雖然這是兩個單獨的步驟,但它們聯(lián)系甚密。有些類可以通過調用它們的工廠方法來創(chuàng)建對象。創(chuàng)建對象 分配內存和初始化要為對象分配內存,對它的類發(fā)送一個 alloc 消息就能得到該類的一個“原始”(未初始化)的實例。當你為一個對象分配內存時,Objective-C 運行時會在應用的虛擬內存中為該對象預留足夠大的內存空間。除了分配內存本身之外,這個環(huán)節(jié)還有另外幾個用途,例如把實例變量全部設為 0 等。為原始實例分配好內存之后,你必須將其初始化。初始化也就是將對象設置為初始狀態(tài),換句話說,就是讓它的實例變量和屬性為合理的值,然后再返回這個對象。初始化是為了保證返回的對象可以被使用。你會發(fā)現(xiàn)在不少框架中都含有 initializers(初始器)方法,即可以初始化對象的方法。它們的形式大多類似。初始器是實例方法,方法開頭為 init,返回一個 id 類型的對象。根對象 NSObject 聲明了 init 方法,所有其他的類都繼承了這個方法。其他的類當然也可以聲明自己的初始器,各自要有自己的關鍵字和參數類型。例如,NSURL 類聲明了如下初始器:1. - (id)initFileURLWithPath:(NSString *)path isDirectory:(BOOL)isDir當你為一個對象分配內存并將其初始化的時候,可以將內存分配方法和初始化方法嵌套起來。如果使用上邊這個初始器的話,可以寫成這樣:1. NSURL *aURL = NSURL alloc initFileURLWithPath:NSTemporaryDirectory() isDir:YES;作為一種安全的編程習慣,你可以檢查返回的對象以驗證對象的創(chuàng)建是否正確。如果創(chuàng)建過程中發(fā)生了意外而導致對象創(chuàng)建失敗,初始器將返回 nil。雖然 Objective-C 允許對 nil 發(fā)送消息而不會產生任何副作用(比如拋出異常),但你的代碼顯然不可能正常工作,因為沒有任何方法能夠被調用。你不應該使用 alloc 返回的實例,而要使用初始器返回的實例。通過調用類的工廠方法來創(chuàng)建對象通過調用類的工廠方法也能創(chuàng)建一個對象。工廠方法是一種類方法,它能夠分配內存、初始化,并返回實例自身。類的工廠方法屬于一種便捷方法,因為它們只需一步就可以創(chuàng)建對象,而不是上文講過的兩步。它們的形式是這樣的:1. + (type)className (這里的 類名稱 不包含任何前綴)Objective-C 框架中的類有些會定義一種工廠方法,這種工廠方法實際上起到了初始器的作用。比如,NSString 就聲明了如下兩種方法:1. - (id)initWithFormat:(NSString *)format, ;2. + (id)stringWithFormat:(NSString *)format, ;3. 下邊的例子就是 NSString 工廠方法的一種用法:1. NSString *myString = NSString stringWithFormat:Customer: %, self.record.customerName;2. 課時:用對象的術語來思考3. 摘要:4. 在運行時,每個應用都是一組互相協(xié)作的對象構成的;這些對象互相之間可以通信,以完成應用所需的工作。每個對象都有自己的角色,至少要對一件事負責,并且至少連接一個其他對象。(孤立的對象毫無價值。)如下5. 在運行時,每個應用都是一組互相協(xié)作的對象構成的;這些對象互相之間可以通信,以完成應用所需的工作。每個對象都有自己的角色,至少要對一件事負責,并且至少連接一個其他對象。(孤立的對象毫無價值。)如下圖所示,對象所組成的網絡中既有框架對象也有應用程序對象。應用程序對象時自定義的子類的實例,一般繼承自某個父類框架。這些對象組成的網絡一般被成為對象圖。6.7. 8. 你需要創(chuàng)建這些連接,或者關系,在各個對象之間進行引用。引用的語言形式有很多,其中有實例變量、全局變量,甚至包括(在有限的作用域內)本地變量。而關系,可以是一對一關系,也可以是一對多關系,可以表示出一系列從屬關系的概念。這些關系就是某個對象對其他對象進行訪問、溝通或者控制的手段。被引用的對象自然也就成了消息的接收者。9. 應用的對象間傳遞的消息是讓應用持續(xù)工作的重要因素。好比樂團中的演奏家一樣,應用中的每個對象都有各自的角色,為應用的運行履行自己的這部分職責。有的對象可以顯示一個橢圓形的界面響應點按動作,有的會管理一些承載各種數據的數據集合,有的則控制整個應用生命周期內的各大事件。但為了完成它們各自的任務,它們還必須能夠互相交流。每個對象都要有向同一應用中別的對象發(fā)送消息的能力,也要有接收別的對象發(fā)來的消息的能力。10. 有些對象之間緊密成對,即互相之間直接相連,它們互發(fā)消息時是很容易的。但還有些非緊密成對的對象,即在對象圖中被分隔開的對象,它們之間要進行通信就要另想辦法。Cocoa 和 Cocoa Touch 框架含有許多幫助非緊密成對的對象進行通信的功能和機制(如下圖所示)。這些機制和技術都建立在一些設計模式之上(我們會在后面探討),這樣就使得應用更加高效并且具有超強的可擴展性。11.課時:管理對象圖,避免內存泄漏摘要:Objective-C 程序里的對象共同組成一張對象圖:由各個對象和其他對象的關系(或引用)而形成的網絡。對象之間的引用分為一對一和一對多(通過對象集合)引用。對象圖十分重要,因為它是使對象保持Objective-C 程序里的對象共同組成一張對象圖:由各個對象和其他對象的關系(或引用)而形成的網絡。對象之間的引用分為一對一和一對多(通過對象集合)引用。對象圖十分重要,因為它是使對象保持生命力的關鍵因素。編譯器會檢查對象圖中引用的強弱,并根據需要保持對象發(fā)出或釋放對象消息。在 C 語言或 Objective-C 語言中,可以使用含有全局變量、實例變量或本地變量的結構來構造對象間的引用。這些結構各自都有自己暗含的作用域。比如,本地變量引用的一個對象的作用域就是聲明它的函數塊所在的位置。同樣重要的是,對象間的引用也是分強弱的。強引用會指示出自己的所有者是誰;指向別人的對象擁有被指向的對象。弱引用則是指向別人的對象和被指向的對象之間沒有從屬關系。對象的生命周期由它的強引用數量多少決定。只要對象有強引用關系,它就不會被釋放。Objective-C 里的引用默認都是強引用。通常來說這很方便,讓編譯器管理對象的運行時生命周期,當你使用對象時它們不會被釋放。但是如果粗心未作全面檢查,對象間的強引用可能會形成無限循環(huán),如下圖左邊所示。這樣的循環(huán)鏈在運行時會導致運行時不會釋放任何一個對象,它們都有指向自己的強引用。繼而,這樣的死循環(huán)就造成了內存泄露。就圖中的對象而言,如果你取消 A 和 B 之間的引用,則 B、C、D、E 構成的子對象圖則“永遠”不會從內存中釋放,因為這些對象每一個都有強引用,形成了一個死循環(huán)。如果在 E 和 B 之間引入弱引用,就可以打破強引用死循環(huán)了。為了修正強引用死循環(huán)的問題,精明的程序員會使用弱引用。運行時會持續(xù)跟蹤對象的弱引用。一旦對象不再有強引用,運行時就會從釋放該對象,并將所有指向該對象的引用改為 nil。對變量來說(全局、實例和本地變量),在對象名前面加上 _weak 限定詞就可以將其標記為弱引用。對于屬性來說,可以使用 weak 選項。在以下這幾類引用中,你應該使用弱引用:1. 委托1. property(weak) id delegate;在設計模式篇里,“用設計模式讓應用開發(fā)流水線化”教程將向你詳解委托和目標機制。2.未被頂級對象引用的插座變量(Outlet)1. property(weak) IBOutlet NSString *theName;插座變量是對象間的一種連接(或引用),被歸檔在故事版文件或 nib 文件中,當應用運行并載入故事版或 nib 文件時就會恢復插座變量。故事版或 nib 文件中頂級對象的插座變量一般而言是窗口、視圖、視圖控制器或其他控制器等,應該為 強引用(默認的,或未標記的)。3.目標1. (void)setTarget:(id _weak)target4.塊對象中指向 self 的引用1. _block typeof(self) tmpSelf = self;2. self methodThatTakesABlock: 3. tmpSelf doSomething;4. ;塊對象會對它捕獲的變量產生強引用。如果你在塊對象里使用了 self,則會對 self 產生強引用。所以,如果 self 對塊對象也有強引用(通常都會這樣),就形成了強引用死循環(huán)。為了避免死循環(huán),你需要在塊對象的外面創(chuàng)建一個指向 self 的 弱(或 _block)引用,如上邊的范例所示。課時:管理對象的可變性,創(chuàng)建并使用值對象摘要:管理對象的可變性 可變對象是指在你創(chuàng)建后能夠變更其狀態(tài)的對象。一般來說你需要使用屬性或存取方法來進行改變。不可變對象則是創(chuàng)建后便被封裝好,狀態(tài)不可改變的對象。在 Objective-管理對象的可變性可變對象是指在你創(chuàng)建后能夠變更其狀態(tài)的對象。一般來說你需要使用屬性或存取方法來進行改變。不可變對象則是創(chuàng)建后便被封裝好,狀態(tài)不可改變的對象。在 Objective-C 框架中創(chuàng)建的大部分類的實例都是可變的,但有幾種是不可變的。不可變對象具有如下優(yōu)點: 在使用不可變對象時,不用擔心它的值會發(fā)生意外變化。 對于許多類型的對象而言,不可變對象能夠提升應用程序的性能。在 Objective-C 框架中,不可變類的實例通常是封裝起來的離散值或緩沖區(qū)值的集合,比如數組和字符串。這些類通常帶有一個可變的衍生類,類名里多出“Mutable”(可變)一詞。比如有一個NSString類(不可變)和 NSMutableString 類。需要注意的是,對于 NSNumber 或 NSDate 等封裝了離散值的不可變對象,就沒必要存在可變的衍生類了。如果你需要經常改變對象的內容,那么就使用可變對象,而不使用不可變對象。如果你從框架中接收到的對象是個不可變對象,請遵照返回的類型來行事,不要嘗試改變對象的內容。創(chuàng)建并使用值對象值對象是指封裝了(C 語言類型的)基本數據類型值的對象,并提供一系列與該值有關的功能。值對象在對象表中代表的是標量類型。Foundation 框架為你提供了下列類,用來生成字符串、二進制數據、日期和時間、數字等值對象: NSString 和 NSMutableString NSData 和 NSMutableData NSDate NSNumber NSValue值對象在 Objective-C 編程中十分重要,因為應用會把這些對象當作方法、函數的參數和返回值進行調用。通過傳遞值對象,框架里的各個部分甚至不同的框架之間便能夠交換數據。因為值對象代表的是標量值,因此你可以在集合或者其他需要用到對象的地方使用它們。值對象除了有普通數據類型的相同特征和作為編程的必要成分之外,還有更大的優(yōu)勢:你能夠通過更加有效而且十分優(yōu)雅的方式對這些封裝起來的值進行操作。就拿 NSString 類來舉例,它有搜索并替換字符串的方法,有寫入字符串到文件或(更常用)到 URL 的方法,還有構建文件系統(tǒng)路徑的方法等。在有些場合中,你可能覺得使用基本數據類型更加有效和直接,例如 int(整數型)、float(浮點型)等等。舉個具體的例子就是在計算某個值的時候。所以 NSNumber 和 NSValue 對象很少被當作框架中方法的參數和返回值。然而,需要注意到許多框架會聲明自己的數值數據類型,并把這些數據類型當作參數和返回值進行傳遞和調用,比如 NSInteger 和 CGFloat。你需要在合適的場合使用這些框架定義的數據類型,這樣能夠幫助你把代碼提煉出來,遠離底層平臺。使用值對象的基本方法創(chuàng)建值對象的基本模式是:為你的代碼或框架代碼利用基本數據類型值創(chuàng)建一個值對象(可能稍后就將其作為方法的參數傳遞出去)。在你的代碼中,你稍后就會訪問對象中封裝的數據了。用 NSNumber 類來舉例再合適不過了:1. int n = 5; / 基本數據類型的賦值2. NSNumber *numberObject = NSNumber numberWithInt:n; / 利用基本數據類型創(chuàng)建一個值對象3. int y = numberObject intValue; / 從值對象中獲得封裝后的數值(y = n)多數“值”類會聲明一個初始器以及用來創(chuàng)建實例的工廠方法。有些類比如 NSString 和 NSData 不僅提供了初始器,還有利用存儲在本地、遠程文件甚至內存中的數據來創(chuàng)建實例的工廠方法。這些類還提供了一些補充方法,可以將字符串和二進制數據寫入某個文件或 URL 制定的位置中。下邊的范例代碼演示了 initWithContentsOfURL: 方法利用一個 URL 對象中制定的文件的內容創(chuàng)建了一個 NSData 對象;在使用完數據之后,代碼將數據對象寫回文件系統(tǒng)中:1. NSURL *theURL = / 利用字符串路徑創(chuàng)建文件 URL 的代碼2. NSData *theData = NSData alloc initWithContentsOfURL:theURL;3. / 使用得到的數據4. theData writeToURL:theURL atomically:YES;大多數值類除了能夠創(chuàng)建值對象并讓你訪問封裝好的值以外,還提供一系列簡單的操作比如比較對象等。字符串作為 C 語言的超集,Objective-C 關于字符串的用法和 C 語言一樣。換句話說,單個字母用單括號包裹,字符串用雙括號。不過,Objective-C 框架一般而言不會使用 C 風格的字符串,而是使用 NSString 對象。在你的第一個 iOS 應用教程中,在編寫 HelloWorld 應用時你曾創(chuàng)建了一個格式化的字符串:1. NSString *greeting = NSString alloc initWithFormat:”Hello, %!”, nameString;NSString 類為字符串提供了一個對象包裹,因此自帶有不定長字符串存儲的內存管理功能、支持眾多字符編碼(尤其是 Unicode 編碼)、以及 printf 風格的格式化語法。因為你會經常用到字符串,因此 Objective-C 提供了利用常量創(chuàng)建 NSString 對象的快捷形式。要使用這種快捷形式,只需在常規(guī)的雙引號包裹的字符串前邊加上 符號,像下面的范例中這樣:1. / 創(chuàng)建字符串“My String”并帶上一個換行符2. NSString *myString = ”My Stringn”;3. / 創(chuàng)建一個格式化字符串“1 String”4. NSString *anotherString = NSString stringWithFormat:%d %, 1, String;5. / 利用一個 C 語言字符串創(chuàng)建 Objective-C 字符串6. NSString *fromCString = NSString stringWithCString:A C string encoding:NSASCIIStringEncoding;時間和日期NSDate 對象和其他的值對象不同,因為它在根本上是時間而不是基本數據類型。日期對象利用參考時間,按秒封裝了一個間隔值。參考時間就是 GMT 2001 年 1 月 1 日的第一個實例。光是 NSDate 的實例自身可能用處還不是很大。它確實能代表某個時刻,但沒有日歷、時區(qū)和個別地區(qū)的時間約定等這些上下文,并無太大意義。幸好 Foundation 類提供了這些概念的實體: NSCalendar 和 NSDateComponents:你可以將日期和日歷聯(lián)系起來,包括由此引申出的時間單位例如年、月、小時、一周中的某一天等。你還可以進行日期的計算。 NSTimeZone:當日期和時間必須反映出某個地區(qū)的時區(qū)時,你可以將時區(qū)對象和日歷關聯(lián)起來。 NSLocale:本地化對象,里面封裝了和時間有關的文化和語言格式的規(guī)約。下面的代碼段展示了如何使用 NSDate 對象配合上述這些對象來獲取你需要的信息(本例中,當前時間的打印格式為小時,分鐘,秒)。請參考代碼段下邊對應的數字項后邊的注釋:1. NSDate *now = NSDate date; / 12. NSCalendar *calendar = NSCalendar alloc initWithCalendarIdentifier:NSGregorianCalendar; / 23. calendar setTimeZone:NSTimeZone systemTimeZone; / 34. NSDateComponents *dc = calendar components:(NSHourCalendarUnit|NSMinuteCalendarUnit|5. NSSecondCalendarUnit) fromDate:now; / 46. NSLog(”The time is %d:%d:%d”, dc hour, dc minute, dc second); / 51. 創(chuàng)建一個表示當前時間的日期對象。2. 創(chuàng)建一個表示公歷的對象。3. 用代表系統(tǒng)偏好設置中設定的時區(qū)的對象,設置日歷對象的時區(qū)。4. 調用日歷對象的 components:fromDate: 方法,將第一步里創(chuàng)建的日期對象作為參數傳遞。調用此方法后會返回一個包含了時間對象的小時、分鐘和秒元素的對象。5. 在控制臺打印出當前的時、分、秒。雖然這個范例最終將結果打印出來,但更加推薦的使用方式是利用日期格式化器(NSDateFormatter 類的實例)在應用的界面上顯示日期信息。在進行日期計算時一定要選用正確的類和方法;不要對時、分、秒、日等數值單位進行硬編碼。課時:創(chuàng)建并使用群體摘要:群體也是一種對象,它能夠以特定方式存儲其他對象并允許客戶訪問那些對象。你通常會將群體當作方法和函數的參數進行傳遞,也常常從方法和函數的返回值獲得一個群體。群體往往包含值對象,但其實它們可以包含任群體也是一種對象,它能夠以特定方式存儲其他對象并允許客戶訪問那些對象。你通常會將群體當作方法和函數的參數進行傳遞,也常常從方法和函數的返回值獲得一個群體。群體往往包含值對象,但其實它們可以包含任何類型的對象。大部分群體對它們所包含的對象會產生強引用。Foundation 框架種有好幾種群體,其中三種在 Cocoa 和 Cocoa Touch 編程中極其重要:數組、字典和集合。這些群體的類同樣分別有不可變與可變的形式??勺內后w能夠添加和移除對象,不可變群體只能含有它們創(chuàng)建時所包含的對象。所有群體都可以進行枚舉,也就是輪流檢查所包含的每個對象。不同類型的群體會以各自不同的方式組織它們所包含的對象: NSArray 和 NSMutableArray:數組是按順序存儲的一系列對象。你可以通過某個對象的位置序號來找到它(也就是它的索引)。數組中的第一個對象索引為 0(數字零) NSDictionary 和 NSMutableDictionary:字典將條目以“鍵值對(Key-Value)”的形式存儲在一起。鍵是唯一標識符,通常是字符串;值就是你想要存儲的對象本身。你可以通過鍵來直接訪問它對應的對象。 NSSet 和 NSMutableSet:集合里的對象是無序存儲的,并且每個對象只能出現(xiàn)一次。通常要訪問集合里的某個或某幾個對象時,你必須使用篩選或對對象進行判斷等方式。由于它們的存儲、訪問和性能各有不同,在不同的場合也就各有利弊。在數組中以特定順序存儲對象數組中的對象是按順序存儲的。因此,當順序比較重要時你就可以選擇數組。舉個例子,許多應用都采用數組來存儲表格視圖中的內容或者菜單中的項目;索引值為 0 的對象代表第一排,索引值 1 上的對象對應第二排,以此類推。訪問數組中對象的速度比訪問集合的速度稍慢。NSArray 類有多個初始器和類工廠方法用來創(chuàng)建和初始化數組,其中有幾個尤其常用。你可以利用一系列對象來創(chuàng)建數組,使用 arrayWithObjects:count: 和 arrayWithObjects: 方法(及其對應的初始器)即可。前邊一個方法的第二個參數可以用來限制第一個參數中的對象個數;后面的方法中你可以使用 nil 來中止一系列用半角逗號分隔的對象。1. / 創(chuàng)建一個含有字符串對象的靜態(tài)數組2. NSString *objs3 = ”O(jiān)ne”, ”Two”, ”Three”;3. / 用該靜態(tài)對象創(chuàng)建一個新數組對象4. NSArray *arrayOne = NSArray arrayWithObjects:&(*objs) count:3;5. / 創(chuàng)建一個用 nil 結尾的對象列表的數組6. NSArray *arrayTwo = NSArray alloc initWithObjects:”O(jiān)ne”, ”Two”, ”Three”, nil;在創(chuàng)建可變數組時,你可以使用 arrayWithCapacity:(或 initWithCapacity:)方法來創(chuàng)建此數組。容量參數只是作為期待數組大小的預設值,能夠讓數組在運行時更加高效。也就是說,數組的實際大小可以超過所指定的容量。一般情況下,要通過索引位置(從 0 起始)訪問數組中的對象時需要調用 objectAtIndex: 這個方法:1. NSString *theString = arrayTwo objectAtIndex:1; / 返回數組中的第二個對象NSArray 還有其他方法,你可以訪問數組中的對象,也可以訪問它們的索引。比如 lastObject、firstObjectCommonWithArray: 和 indexOfObjectPassingTest: 方法。數組的另一個重要功能是對所包含的每個對象均進行操作,這個過程叫做枚舉。你通常會枚舉某個數組,以此判斷某個或某些對象是否符合某個值或者條件,如果條件成立則可以進一步進行操作。共有三種枚舉方式可供選用:快速枚舉,塊對象枚舉,或者使用 NSEnumerator 對象??焖倜杜e正如其名稱所示,一般而言在獲取數組中的對象時比其他枚舉方式更快??焖倜杜e有其特定的語法:1. for (type variable in array) /* 規(guī)定 variable,并執(zhí)行所需的操作 */ 比如此例:1. NSArray *myArray = / 獲取數組2. for (NSString *cityName in myArray) 3. if (cityName isEqualToString:Cupertino) 4. NSLog(”Were near the mothership!”);5. break;6. 7. 有幾種 NSArray 方法是通過塊對象進行枚舉的,最簡單的一個是 enumerateObjectsUsingBlock:。塊對象有三個參數:當前對象,它的索引值,以及一個布爾值,如果它為 YES 則枚舉結束。塊對象中的代碼效果和花括號里的快速枚舉效果完全一樣:1. NSArray *myArray = / 獲取數組2. myArray enumerateObjectsUsingBlock:(id obj, NSUInteger idx, BOOL *stop) 3. if (NSString *)obj isEqualToString:Cupertino) 4. NSLog(”Were near the mothership!”);5. *stop = YES;6. 7. ;NSArray 還有數組排序、搜索、對數組中每個對象起作用等的方法。若要往可變數組中添加對象,則要調用 addObject: 方法;新增的對象會被放置在數組末尾。你也可以使用 insertObject:atIndex: 將對象放在數組中的某特定位置。通過調用 removeObject: 或者 removeObjectAtIndex: 方法就可以將對象從數組中移除了。用字典存儲鍵值對利用字典可以將對象以鍵值對的形式存儲在群體中,鍵值對是指一個標識符(鍵)與一個對象(值)組成的對子。字典是無序群體,因為鍵值對可以以任何順序存儲。雖然鍵可以是任意形式,但最好是能夠描述值的字符串,比如 NSFileModificationDate 或 UIApplicationStatusBarFrameUserInfoKey(都是字符串常量)。當它們是公有鍵時,用字典在任意類型的對象之間傳遞信息再好不過了。通過它的初始器和類工廠方法,NSDictionary 類有許多創(chuàng)建字典的方式,但其中兩個是最為常用的:dictionaryWithObjects:forKeys: 和 dictionaryWithObjectsAndKeys:(或者它們對應的初始器)。前一個方法中你需要傳入一個對象數組和鍵數組;鍵和值要在位置上一一對應。后面一個方法中你需要指定第一個對象值和它的鍵、第二個對象值和它的鍵、第三個、第四個,以此類推;用 nil 便可以結束這個對象系列。1. / 首先創(chuàng)建一個鍵的數組以及一個值的補充數組2. NSArray *keyArray = NSArray arrayWithObjects:IssueDate, IssueName, IssueIcon, nil;3. NSArray *valueArray = NSArray arrayWithObjects:NSDate date, ”Numerology Today”,4. self.currentIssueIcon, nil;5. / 創(chuàng)建字典,將鍵數組和值數組傳入6. NSDictionary *dictionaryOne = NSDictionary dictionaryWithObjects:valueArray forKeys:keyArray;7. / 用值、鍵輪流的方式創(chuàng)建數組,用 nil 來結束本字典8. NSDictionary *dictionaryTwo = NSDictionary alloc initWithObjectsAndKeys:NSDate date,9. ”IssueDate”, ”Numerology Today”, ”IssueName”, self.currentIssueIcon, ”IssueIcon”, nil;要訪問字典中的對象值,需要調用 objectForKey: 方法,并在參數中指定一個鍵。1. NSDate *date = dictionaryTwo objectForKey:IssueDate;你可以向可變字典中通過調用 setObject:forKey: 添加條目,也可以用 removeObjectForKey: 刪除條目,還可以用 setObject:forKey: 來替換任何給定鍵所對應的值。這些方法運行速度都很快。用集合存儲無序對象集合與數組相似也是對象群體,但集合中的條目是無序存儲的。你無法通過索引或者鍵來訪問集合里的對象,而是隨機訪問(anyObject),通過枚舉群體或者使用篩選器、測試等方式查找對象。雖然在 Objective-C 中集合對象不像字典和數組那么常用,它們仍然是某些技術中非常重要的群體類型。在 Core Data(一種數據管理技術)中,當你聲明一個一對多關系的屬性時,屬性類型就應該是 NSSet 或者 NSOrderedSet。集合在 UIKit 框架中的原生觸摸事件處理中也是非常重要的,比如:1. - (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event 2. UITouch *theTouch = touches anyObject;3. / 處理代碼4. 有序集合是集合定義之外的一個特例。在有序集合中,條目的順序十分重要。測試某個條目是否存在時,有序集合比數組的速度更快。課時:在運行時檢驗對象能力摘要:內省(Introspection)是 Objective-C 中 NSObject 類的一個強大而實用的特性,可以讓你在運行時獲知關于對象的一些信息。這樣,你就能避免一些錯誤,比如將消息發(fā)送給一內省(Introspection)是 Objective-C 中 NSObject 類的一個強大而實用的特性,可以讓你在運行時獲知關于對象的一些信息。這樣,你就能避免一些錯誤,比如將消息發(fā)送給一個不認識它的對象,或者以為某個對象繼承自另一個對象,實際上卻不是。在運行時,對象可以傳達關于它自己的三種重要類型的信息。 它是否是某個類或子類的實例 它是否能響應某條消息 它是否遵守某個協(xié)議探究對象是否是某個類或其子類的實例這樣做的方式是對對象調用 isKindOfClass: 方法:1. static int sum = 0;2. for (id item in myArray) 3. if (item isKindOfClass:NSNumber class) 4. int i = (int)item intValue;5. sum += i;6. 7. isKindOfClass: 方法需要一個 Class 類型的對象作為參數;要獲得這個對象,在類符號上調用 class 方法便可。檢查此方法返回的布爾值并進行下一步操作。NSObject 還聲明了其他用來探究對象繼承信息的方法。比如 isMemberOfClass: 方法會告訴你對象是否是某個指定類的實例,而 isKindOfClass: 會告訴你對象是否是某個類或其子類的成員。探究對象是否能夠響應某個消息這樣做的方法是對對象調用 respondsToSelector: 方法:1. if (item respondsToSelector:selector(setState:) 2. item setState:self.arcView.font isBold ? NSOnState : NSOffSta
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 代理營銷活動策劃方案
- 代賬公司團購活動方案
- 以書為媒活動策劃方案
- 儀隴全域閱讀活動方案
- 企業(yè)講課比賽活動方案
- 企業(yè)party活動方案
- 企業(yè)五四節(jié)系列活動方案
- 企業(yè)黨建比武活動方案
- 企業(yè)內讀書活動方案
- 河道疏浚對漁業(yè)發(fā)展的影響與對策
- 超市供貨合同補充協(xié)議書
- 2025-2030中國肺癌行業(yè)市場現(xiàn)狀供需分析及投資評估規(guī)劃分析研究報告
- 自愿倒班協(xié)議書
- 湖北省新華書店(集團)有限公司市(縣)分公司招聘筆試題庫2025
- 高考日語培訓協(xié)議書
- 2025年江蘇省泰州市中考二模數學試題(含部分答案)
- 鋼筋綁扎技術交底(鋼筋)
- 貸款居間協(xié)議書范本
- 佛山事業(yè)考試試題及答案
- 施工過程中常見安全隱患的識別與預防
評論
0/150
提交評論