版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、Learn ObjectiveC原文地址譯者前言在網(wǎng)上看到這篇文章覺得寫的很不錯(cuò),但是貌似沒有人翻譯成中文,我就大膽翻譯 了。本人做軟件開發(fā)6年了,但是大多數(shù)是在Windows平臺(tái)上,最近才在我的機(jī)器上裝 了一個(gè)leopard,在ObjectiveC上也是一個(gè)新手,對(duì)于本文翻譯的是否到位心里還 在打鼓。如果有覺得翻譯不對(duì)不好的地方,請(qǐng)與我聯(lián)系,我的油箱是:cchenhao at gmail dot com。cc很好J,謝謝大家。ObjectiveCObjectiveC是開發(fā)Mac軟件的主要編程語言。如果你了解一些面向?qū)ο蟮幕靖拍詈?C語言,那么會(huì)對(duì)你學(xué)習(xí)ObjectiveC有很多
2、幫助,如果你不了解C,那么建議你先讀一下 C 指南。這篇指南由Scott Stevenson編寫并做圖。方法調(diào)用為了盡快開始,讓我們先看一些例子。調(diào)用一個(gè)對(duì)象的方法的基本語法是這樣的:object method;object methodWithInput:input;方法可以有返回值:output = object methodWithOutput;output = object methodWithInputAndOutput:input;你還可以調(diào)用類的方法,這也是創(chuàng)建一個(gè)對(duì)象的辦法。在下面的例子里,我們調(diào)用 了NSSting類的string方法,用來返回一個(gè)新的NSString類的對(duì)象
3、。id myObject = NSString string;id類型意味著變量myObject可以是任意類型的對(duì)象。所以,當(dāng)你編譯這段代碼時(shí), 它的實(shí)際類型以及它所實(shí)現(xiàn)的方法編譯器是不知道的。在我們的例子里,很顯然對(duì)象的類型是NSString,所以我們可以改變對(duì)象的類型 聲明:NSString* myString = NSString string;現(xiàn)在,這就是一個(gè)NSString類型的變量了,如果我們?cè)谶@個(gè)對(duì)象上調(diào)用NSString類型對(duì)象不支持的方法,編譯器就會(huì)發(fā)出警告。注意:在對(duì)象類型的右面有一個(gè)星號(hào)(*),在Objective-C中,所有的對(duì)象變量 都是指針類型。id類型已經(jīng)被預(yù)定義
4、為指針類型,所以不需要加一個(gè)星號(hào)。嵌套調(diào)用在許多編程語言中,嵌套的方法或函數(shù)調(diào)用像是這樣的:function1(function2();function2的返回值做為輸入?yún)?shù)傳遞給function1。在Objective-C中,嵌套 調(diào)用看上去像是這樣的:NSString stringWithFormat:prefs format;要盡量避免在一行語句中進(jìn)行兩層以上的嵌套,這樣會(huì)使代碼的可讀性降低。多輸入?yún)?shù)的方法一些方法需要多個(gè)輸入?yún)?shù)。在Objective-C中,一個(gè)方法的名字可以被拆分成幾段,在頭文件中,多輸入?yún)?shù)的方法聲明看上去像是這樣的:-(BOOL)writeToFile:(NSS
5、tring *)path atomically:(BOOL)useAuxiliaryFile;你可以這樣調(diào)用這個(gè)方法:BOOL result = myData writeToFile:”/tmp/log.txt”atomically:NO;這些不是命名參數(shù)。在運(yùn)行時(shí)環(huán)境中,該方法的名字實(shí)際上是writeToFile:atomically:訪問器在ObjectiveC中,所有的實(shí)例變量默認(rèn)都是私有的,所以,在大多數(shù)情況下,你應(yīng) 該使用訪問器來獲取或設(shè)置這些變量的值。現(xiàn)在有兩種語法。下面的是傳統(tǒng)的1.x語法:photo setCation:”Day at the Beach”;output = p
6、hoto caption;第2行代碼不是直接讀取實(shí)例變量。實(shí)際上它是在調(diào)用名為caption的方法。在Objective-C中,大多數(shù)情況你不用在獲取器(getter)前面添加一個(gè)”get”前綴在任何情況下,在方括號(hào)中代碼都意味著你是在給一個(gè)對(duì)象或者一個(gè)類型發(fā)送一個(gè) 消息(即一個(gè)方法調(diào)用)。點(diǎn)操作符在Mac OS X 10.5中,Objective-C 2.0新增了點(diǎn)操作符的設(shè)置器(setter) 和獲取器(getter):photo.caption = ”Day at the Beach”;output = photo.caption;兩種語法你可以使用任何一種,但是在一個(gè)項(xiàng)目中最好只使用一
7、種。同時(shí),點(diǎn)語法 只能使用在設(shè)置器(setter)和獲取器(getter)上,而不能用于普通方法。創(chuàng)建對(duì)象創(chuàng)建對(duì)象有兩種主要的辦法。第一個(gè)是之前你看到的:NSString* myString = NSString string;這是一種更加方便自然的方式。通過這種方法,你創(chuàng)建了一個(gè)自動(dòng)釋放 (autoreleased)的對(duì)象,這一點(diǎn)我們會(huì)在后面看到更多的細(xì)節(jié)。盡管如此,在許多 地方,你可能需要通過手工創(chuàng)建的方式來創(chuàng)建一個(gè)對(duì)象,如下:NSString* myString = NSString alloc init;這是一個(gè)嵌套的方法調(diào)用。第一個(gè)是NSString類本身的alloc方法調(diào)用。這是一
8、 個(gè)相對(duì)低層的調(diào)用,它的作用是分配內(nèi)存及實(shí)例化一個(gè)對(duì)象。第二個(gè)是調(diào)用新創(chuàng)建對(duì)象的init方法。init方法通常做對(duì)象的初始化設(shè)置工作, 比如創(chuàng)建實(shí)例變量。作為一個(gè)類的使用者,你無法知道這些方法的實(shí)現(xiàn)細(xì)節(jié)。在某些情況下,你可以使用init方法的另外一種版本,這些版本帶有輸入?yún)?shù):NSNumber* value = NSNumber alloc initWithFloat:1.0;內(nèi)存管理基礎(chǔ)當(dāng)你為Mac OS X編寫應(yīng)用程序時(shí),你可以選擇允許垃圾回收。這意味著如果不是 在特別復(fù)雜的情況下,你不用考慮內(nèi)存管理。然而,你并不會(huì)總是工作在支持垃圾回收的環(huán)境中。這樣的話,你就需要知道一些 基本概念。如果
9、你通過手工alloc的方式創(chuàng)建一個(gè)對(duì)象,之后你需要release這個(gè)對(duì)象。同樣, 你也不能手工釋放(release)一個(gè)能自動(dòng)釋放(autoreleased)的對(duì)象,因?yàn)檫@將會(huì) 使你的應(yīng)用程序崩潰。以下是兩個(gè)例子:/string1 將被自動(dòng)釋放NSString* string1 = NSString string;/必須在用完后手工釋放NSString* string2 = NSString alloc init; string2 release;在這里,你可以認(rèn)為自動(dòng)釋放對(duì)象會(huì)在當(dāng)前函數(shù)結(jié)束的時(shí)候被自動(dòng)釋放。 關(guān)于內(nèi)存管理要學(xué)的東西很多,但是我們先了解一下其他的概念,這樣我們會(huì)有更多的認(rèn)識(shí)。
10、設(shè)計(jì)類接口在Objective-C的語法中,創(chuàng)建一個(gè)類是非常簡(jiǎn)單的。一個(gè)類通常分為兩部分。類的接口(interface)通常存放在類似ClassName.h的文件中,在這里,我們定義實(shí)例變量和公用(public)方法。類的實(shí)現(xiàn)存放在ClassName.m這樣的文件中,它包含了這些方法的實(shí)際實(shí)現(xiàn)代碼。 它通常還定義了客戶類不能訪問的私有(private)方法。一個(gè)接口文件看上去像以下這樣的。這個(gè)類名字叫做Photo,所以接口文件名是Photo.h:#import <Cocoa/Cocoa.h>interface Photo : NSObject NSString* caption;N
11、SString* photographer;end首先,我們導(dǎo)入了Cocoa.h,目的是將Cocoa應(yīng)用程序的基本類添加進(jìn)來。#import指令會(huì)自動(dòng)防止將同一個(gè)文件導(dǎo)入多次。interface表明這是類Photo的聲明。冒號(hào)后面指定父類(superclass),這里 父類是NSObject。在花括號(hào)里面聲明了兩個(gè)實(shí)例變量:caption和photographer。都是NSString類型,實(shí)例變量可以是任何對(duì)象類型,包括id類型。最后,end符號(hào)結(jié)束類的聲明。添加方法讓我們給實(shí)力變量添加一些獲取器(getter)#import <Cocoa/Cocoa.h>interface P
12、hoto : NSObject NSString* caption; NSString* photographer;- caption;- photographer;end記住,Objective-C語言中通常省略方法的“get”前綴。方法名字前面的單個(gè)減 號(hào)(-)表明該方法是一個(gè)實(shí)例方法。如果方法名字前面是一個(gè)加號(hào)(+),則表明該方法 是一個(gè)類(static)方法。編譯器會(huì)默認(rèn)一個(gè)方法的返回值是一個(gè)id類型的對(duì)象,所有的輸入?yún)?shù)也默認(rèn)是id 類型。上述代碼在技術(shù)上是正確的,但是我們一般不這樣寫,我們需要給這些方法指定 返回值類型。#import <Cocoa/Cocoa.h>in
13、terface Photo : NSObject NSString* caption; NSString* photographer;- (NSString*)caption;- (NSString*)photographer;end現(xiàn)在,我們來添加設(shè)置器(setter):#import <Cocoa/Cocoa.h>interface Photo : NSObject NSString* caption; NSString* photographer;- (NSString*)caption;- (NSString*)photographer;- (void) setCaptio
14、n: (NSString*)input;- (void) setPhotographer: (NSString*)input;end設(shè)置器不需要有返回值,所以我們指定返回值是void。類實(shí)現(xiàn)現(xiàn)在,我們從獲取器(getter)開始,來創(chuàng)建一個(gè)類的實(shí)現(xiàn)。#import "Photo.h"implementation Photo- (NSString*) caption return caption;- (NSString*) photographer return photographer;end這段代碼以implementation和類的名字開始,并且像接口一樣,有一個(gè)end
15、。 所有的方法必須寫在這兩條語句之間。如果你寫過代碼,就會(huì)覺得上面的獲取器看上去很熟悉,所以我們還是來看一看設(shè) 置器,它們需要多一點(diǎn)解釋。- (void) setCaption: (NSString*)inputcaption autorelease;caption = input retain;- (void) setPhotographer: (NSString*)inputphotographer autorelease;photographer = input retain;每一個(gè)設(shè)置器都要處理兩個(gè)變量,第一個(gè)是當(dāng)前引用的對(duì)象,第二個(gè)是新輸入的對(duì)象。在帶有垃圾回收機(jī)制的環(huán)境中,我們可以
16、直接設(shè)置成新的值。- (void) setCaption: (NSString*)inputcaption = input;但是,如果你不能使用垃圾回收,你需要release舊的對(duì)象,并且retain新的對(duì) 象。釋放一個(gè)對(duì)象的引用實(shí)際上有兩種方法:release 和 autorelease。標(biāo)準(zhǔn)的 release會(huì)立刻釋放對(duì)象的引用。autorelease會(huì)等一會(huì)兒才釋放,但是引用實(shí)際上 會(huì)一直存在,直到當(dāng)前方法結(jié)束(除非你添加自定義的代碼來明確的改變它)。在設(shè)置器里面使用autorelease方法會(huì)更加安全一些,因?yàn)橐淖兊淖兞康男屡f兩 個(gè)值可能指向的是同一個(gè)對(duì)象。而你可能不希望立刻釋放實(shí)際
17、上你要保留的對(duì)象?,F(xiàn)在,這看上去有點(diǎn)讓人迷惑,但是隨著你的不斷學(xué)習(xí),你就會(huì)有更多的認(rèn)識(shí)。所 以,現(xiàn)在不必徹底的理解這些。Init我們可以創(chuàng)建一個(gè)init方法用來給我們的實(shí)例變量設(shè)置初始化值:- (id) initif ( self = super init )self setCaption:"Default Caption"self setPhotographer:"Default Photographer"return self;這段代碼是完全不需要加以說明的,盡管第二行看上去有點(diǎn)不常見。它是一個(gè)單個(gè) 的等號(hào)(=),作用是將super init的結(jié)果賦
18、值給self。這實(shí)際上是要求父類做(父類的)初始化操作。if語句的作用是在嘗試設(shè)置(本對(duì) 象的)缺省值之前驗(yàn)證父類是否初始化成功。Deallocdealloc方法在一個(gè)對(duì)象從內(nèi)存中刪除時(shí)被調(diào)用。通常在這個(gè)方法里面釋放所有對(duì)象 里的實(shí)例變量。 (void) dealloccaption release; photographer release; super dealloc;在前兩行,我們直接調(diào)用了實(shí)例變量的release方法。在這里,我們不需要使用autorelease,因?yàn)闃?biāo)準(zhǔn)的release更快一些。最后一行非常重要,我們發(fā)送了一個(gè)super dealloc消息,要求父類做清理工作。如果我
19、們不做的話,該對(duì)象就不會(huì)被從內(nèi)存中刪除,這就造成了內(nèi)存泄露。當(dāng)啟用垃圾回收機(jī)制時(shí),對(duì)象的dealloc方法不會(huì)被調(diào)用。此時(shí),你可以實(shí)現(xiàn)一個(gè)finalize方法來代替它。內(nèi)存管理Objective-C的內(nèi)存管理是基于引用計(jì)數(shù)的。你要做的事情只是關(guān)注你的引用,而釋放內(nèi)存的工作實(shí)際上由運(yùn)行環(huán)境完成。在最簡(jiǎn)單的情形中,你分配的(alloc)對(duì)象,或者是保留(retain)在一些地方 的對(duì)象,都需要給他們發(fā)送一個(gè)release消息。這也意味著,如果你使用了一次alloc, 然后又retain了一次,那么你需要release兩次才能釋放該對(duì)象的內(nèi)存。這就是引用計(jì)數(shù)的理論。在實(shí)際應(yīng)用中,通常只有兩個(gè)原因我們
20、才會(huì)創(chuàng)建一個(gè)對(duì)象:1作為一個(gè)實(shí)例變量保留。2在函數(shù)內(nèi)部作為臨時(shí)變量使用。大多數(shù)情況下,一個(gè)實(shí)例變量的設(shè)置器(setter)會(huì)自動(dòng)釋放(autorelease)原來引用的對(duì)象,同時(shí)保留(retain)新的。你只需要保證在dealloc函數(shù)中釋放(release)了它就行了。那么,我們實(shí)際要做的工作就只有管理函數(shù)內(nèi)部的本地引用了。在這里只有一條規(guī)則:如果過你通過alloc或者copy創(chuàng)建了一個(gè)對(duì)象,在函數(shù)結(jié)尾的地方給它發(fā)送一個(gè)release或者autorelease消息就行了。如果你是通過其它方式創(chuàng)建的對(duì)象,就什么 也別做。下面是第一個(gè)例子,管理實(shí)例變量:- (void) setTotalAmou
21、nt: (NSNumber*)inputtotalAmount autorelease;totalAmount = input retain;- (void) dealloctotalAmount release; super dealloc;下面是另外一個(gè)例子,關(guān)于本地引用。我們只需要釋放通過alloc創(chuàng)建的對(duì)象就行了:NSNumber* value1 = NSNumber alloc initWithFloat:8.75; NSNumber* value2 = NSNumber numberWithFloat:14.78;/ only release value1, not value2
22、value1 release;下面是一個(gè)組合例子,將一個(gè)本地引用設(shè)置給實(shí)例變量:NSNumber* value1 = NSNumber alloc initWithFloat:8.75; self setTotal:value1;NSNumber* value2 = NSNumber numberWithFloat:14.78; self setTotal:value2;value1 release;注意,不論你是不是把本地引用當(dāng)成實(shí)例變量一樣賦值,管理它們都是完全相同的。 你不必考慮設(shè)置器(setter)是如何實(shí)現(xiàn)的。如果你理解了這些,你就理解了關(guān)于Objective-C內(nèi)存管理中90%你需
23、要知道的內(nèi)容。日志記錄在Objective-C中,將日志信息輸出到控制臺(tái)是非常簡(jiǎn)單的。實(shí)際上NSLog()函數(shù)很像C語言里面的printf()函數(shù),除了要用一個(gè)%符號(hào)代表一個(gè)對(duì)象。NSLog ( "The current date and time is: %", NSDate date );你可以將一個(gè)對(duì)象的信息作為日志在控制臺(tái)輸出。NSLog函數(shù)調(diào)用該對(duì)象的 description方法,并且將這個(gè)方法返回的NSString打印到控制臺(tái)。你可以在你的 類中重寫這個(gè)方法以返回你自定義的字符串。屬性(Properties)前面我們寫了caption和author的訪問方法,你
24、可能也注意到了,那些代碼很簡(jiǎn)單,應(yīng)該可以寫成具有更普遍意義的形式。屬性是Objective-C的一個(gè)特性,它允許我們自動(dòng)生成訪問器,同時(shí)還有其它方面 的好處。我們用屬性來改寫一下Photo類。之前的代碼看上去是這樣的:#import <Cocoa/Cocoa.h>interface Photo : NSObject NSString* caption; NSString* photographer;- (NSString*) caption;- (NSString*) photographer;- (void) setCaption: (NSString*)input;- (voi
25、d) setPhotographer: (NSString*)input;end用屬性改寫后的代碼看上去是這樣的:#import <Cocoa/Cocoa.h>interface Photo : NSObject NSString* caption; NSString* photographer;property (retain) NSString* caption;property (retain) NSString* photographer;endproperty是Objective-C語言的一個(gè)指令,通過它聲明屬性。帶括號(hào) 的”retain”指示設(shè)置器(setter)要保留
26、輸入值,該行后面的是指定屬性的類型以 及名稱。下面我們看看這個(gè)類的實(shí)現(xiàn)部分:#import "Photo.h"implementation Photosynthesize caption;synthesize photographer;- (void) dealloccaption release; photographer release; super dealloc;endsynthesize指令為我們主動(dòng)生成了setter和getter,所以我們必須要做的就 只有實(shí)現(xiàn)dealloc方法了。只有當(dāng)訪問器不存在的時(shí)候,synthesize才會(huì)自動(dòng)生成訪問器,所以,即使是使
27、 用synthesize聲明了一個(gè)屬性,你仍然可以實(shí)現(xiàn)自定義的getter和setter。編譯 器只會(huì)自動(dòng)生成你沒有自定義的方法。關(guān)于屬性的聲明還有很多選項(xiàng),但是它們超出了本指南的范圍。在Nil上調(diào)用方法在Objective-C中,nil對(duì)象的作用等同于很多其他語言的NULL指針。不同的地方在于,在nil上調(diào)用方法不會(huì)導(dǎo)致程序崩潰或拋出異常。這種技術(shù)被用在很多地方,但是對(duì)于我們來講,最主要的就是我們不用在調(diào)用一個(gè)對(duì)象的方法之前檢查該對(duì)象是否為空。如果你調(diào)用了一個(gè)nil對(duì)象的方法并且該方法有 返回值的話,你會(huì)得到一個(gè)nil返回值。我們也可以用它來稍微改進(jìn)一下我們的dealloc方法:- (voi
28、d) deallocself.caption = nil; self.photographer = nil; super dealloc;可以這樣做是因?yàn)楫?dāng)我們將nil賦值給一個(gè)實(shí)例變量,設(shè)置器(setter)會(huì)釋放舊對(duì) 象并且保留(retain)nil對(duì)象。這種做法對(duì)于dealloc來說更好一些,因?yàn)檫@樣做 避免了讓變量指向一個(gè)隨機(jī)的數(shù)據(jù),而這個(gè)數(shù)據(jù)又恰好是另外一個(gè)對(duì)象。注意,我們?cè)谶@里使用了self.<var>語法,這表示我們使用的是setter,它會(huì)進(jìn) 行內(nèi)存管理。如果我們僅僅是直接設(shè)置值,像下面這樣,那就會(huì)產(chǎn)生內(nèi)存泄露:/ incorrect. causes a memory leak./ use self.caption to go through setter caption = nil;類目(Category)類目是Objective-C中最有用的一個(gè)特性。實(shí)質(zhì)上,類目允許你為一個(gè)已存在的類添加一些方法而不用子類化該類,也不需要你了解該類的實(shí)現(xiàn)細(xì)節(jié)。這是特別有用的,因?yàn)槟憧梢越o一個(gè)內(nèi)建的對(duì)象添加方法。當(dāng)你想在
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 二零二五年度農(nóng)機(jī)租賃市場(chǎng)準(zhǔn)入合同范本資訊4篇
- 二零二五版拌合料生產(chǎn)技術(shù)改造與升級(jí)合同4篇
- 二零二五版建筑工地勞務(wù)用工與綠色施工技術(shù)研發(fā)與推廣合同3篇
- 二零二五版舊設(shè)備買賣及拆解回收再利用合同3篇
- 2025年度綠色交通募集資金三方監(jiān)管與執(zhí)行合同4篇
- 二零二五年度少兒興趣班教室租賃及教學(xué)用品供應(yīng)合同4篇
- 二零二五年度科技園區(qū)場(chǎng)地租賃及研發(fā)合作合同4篇
- 關(guān)于2025年度民法典規(guī)定協(xié)議離婚期限及法律支持4篇
- 二零二五年度智慧社區(qū)建設(shè)合同投標(biāo)單位保密保證
- 二零二五年度外架工程風(fēng)險(xiǎn)評(píng)估與控制服務(wù)合同
- 物業(yè)民法典知識(shí)培訓(xùn)課件
- 2023年初中畢業(yè)生信息技術(shù)中考知識(shí)點(diǎn)詳解
- 2024-2025學(xué)年八年級(jí)數(shù)學(xué)人教版上冊(cè)寒假作業(yè)(綜合復(fù)習(xí)能力提升篇)(含答案)
- 《萬方數(shù)據(jù)資源介紹》課件
- 醫(yī)生定期考核簡(jiǎn)易程序述職報(bào)告范文(10篇)
- 第一章-地震工程學(xué)概論
- 《中國(guó)糖尿病防治指南(2024版)》更新要點(diǎn)解讀
- 初級(jí)創(chuàng)傷救治課件
- 交通運(yùn)輸類專業(yè)生涯發(fā)展展示
- 2024年山東省公務(wù)員錄用考試《行測(cè)》試題及答案解析
- 神經(jīng)重癥氣管切開患者氣道功能康復(fù)與管理專家共識(shí)(2024)解讀
評(píng)論
0/150
提交評(píng)論