2011-11-08 46 views
0

我只寫了一些代碼。它有我自己定製的課程。在所謂的「WonderfulNumbers」是定製類我有一個看起來像這樣使用我沒有分配或初始化的對象

- (NSString *)storedNumberAsString { 
NSString *stringToReturn = [[NSString alloc]initWithFormat:@"Hello World"]; 
return [stringToReturn autorelease]; 
} 

我明明那麼#進口「WonderfulNumbers」到主和方法等 然後在我的主要我有一個IBAction爲。 它讀起來就像下面

-(IBAction)displaySomeText:(id)sender { 
    WonderfulNumbers *myNumber = [[WonderfulNumbers alloc]init];// Step 1 
    NSString *numberString = [myNumber storedNumberAsString];// Step 2 
    [textView insertText:numberString];// Step 3 
    //textView is a variable of NSTextView. 
    [myNumber release];// Step 4 
} 

我得到的循序漸進的過程,而這背後的邏輯。 2.

我明白我想知道,並試圖安撫我自己到底是什麼在步驟發生的第1步,3和4

但第2步,我裝箱一個NSString變量,名爲「 numberString',它顯然擁有上面描述的方法應用於它的名爲'myNumber'的對象。說得通。

我想知道的是,我從來沒有分配或初始化NSString類的「numberString」對象。我怎麼能夠使用它。 我知道我不釋放它,因爲它從來沒有分配過..但我只是通過[myNumber storedNumberAsString]初始化它; ?

輕微的解釋是真棒。感謝那些回覆。

P.S.我知道objective-c中的所有東西都是一個對象,但僅僅是爲了這個參數,因爲'numberString'在技術上並不是由allocate和init創建的「是否正確地調用該變量?

我想我知道這兩個只是想安慰之間的差異。

謝謝。

+0

「numberString」存儲指向由「storedNumberAsString」,這是的NSString @「Hello World」的返回值。 「numberString」本身不是一個對象,它只是保存一個對象指針。 (你不需要把對象本身當作名稱 - 只是指向它們的指針具有名稱。) –

+0

(有點像你有一個辦公室,有一個叫Sam,Joe和Pete的三個辦公桌,辦公桌上有這些名字,不管坐在他們旁邊的人是誰,坐在Sam身上的那個人可以搬到Pete,然後他會稱爲「皮特」,因爲沒有他的名字。) –

+0

真棒,它現在都落入了位置。感謝一羣人。 –

回答

2

要初始化NSString *stringToReturn[myNumber storedNumberAsString]返回值。在storedNumberAsString內部,您可以看到它返回NSString引用,正確分配和全部,因此可以使用。

這裏的關鍵是autorelease,它會導致對象在「稍後某個時候」自動釋放(實際上,當最頂層的autorelease池被釋放時,除非您自己更改它,否則往往會在每次迭代事件循環後發生)。

在Objective-C的約定是,如果你allocretain對象,或者從名稱以newcopy,或mutableCopy,你是負責釋放它的方法獲取的對象。否則,您可以認爲它會被其他人釋放(例如稍後通過autorelease)。由於storedNumberAsString沒有開始newcopy,或mutableCopy,你不需要將其釋放。同時storedNumberAsString的實現必須確保它的對象被釋放 - 在這種情況下,通過調用autorelease來完成。

+0

謝謝你。 當我運行並構建它時,代碼工作正常。據我所知,這是堅實的。 我的擔心大部分是我得到了什麼事情進入我的腦海。 我想在我腦海中想的是「在整個過程的哪一部分我確實分配了'numberString'對象。 非常感謝。 –