2011-06-08 73 views
3

我剛開始學習Objective-C。我讀了Cocoa成爲XCoder的書,我想我學會了基礎知識。現在,我在那裏之後我遇到這段代碼的在線教程:Objective-C初學者(發佈)問題

@synthesize name; 

- (IBAction)changeGreeting:(id)sender { 
self.name = textInput.text; 

NSString *nameString = name; 
if([nameString length] == 0) { 
    nameString = @"Cartman"; 
} 
NSString *greeting = [[NSString alloc] 
         initWithFormat:@"Hello, my name is %@!", nameString]; 
label.text = greeting; 
[greeting release]; 
} 

我在這裏的問題是,我們不應該叫也對* nameString變量「釋放」? 或者通過這樣做,我也會清理應該在'dealloc'方法中釋放的'name'屬性? 因爲如果我理解正確,我必須在函數末尾的所有位於函數內部的變量上調用'release',但是在類屬性中,我只能在'dealloc'方法中調用'release'。

感謝

+0

一般的共識是,如果你調用一個對象的分配,它應該被釋放的地方。我相信你創建NSString是自動釋放的。 – Luke 2011-06-08 22:06:40

回答

2

greeting被釋放,因爲分配它。 nameString不需要被釋放,因爲它是一個賦值。作爲一般的經驗法則,您必須釋放一個對象。

看到偉大的Apple Memory Management Guide爲進一步的幫助。內存管理是很多iOS初學者的一大障礙,內存管理指南基本上應該被要求閱讀。

此外,在這個特定的例子中,你並不需要nameString變量,你可以在任何地方使用self.name

+0

謝謝。確實如此。我來自一個Web環境,PHP和那裏,你肯定不必擔心內存管理,就像你啓動的對象調用@unlink的意義 – Hidden 2011-06-09 07:36:00

5

只發布您聲明所有權的對象。這意味着您設置要保留或複製的每個屬性。不要釋放分配的屬性。

您通過發送alloc,copy,new或mutableCopy聲明所有權。看看Apple's Memory Management Programming Guide/Object Ownership and Disposal。如果您通過發送保留手動保留,也應該釋放。

對此,您不必釋放nameString。

+0

damn.you設法用6行解釋一整章一直未能。我現在明白了,我閱讀了「內存管理指南」,在閱讀完答案之後,現在就有了意義。謝謝! – Hidden 2011-06-09 07:32:07

+0

@隱藏你的歡迎:) – 2011-06-09 07:39:41

+0

歡迎來到10K。 :) – 2011-06-15 07:53:05

0

nameString變量只是一個存儲在名稱類屬性中的指針。所以這個字符串在技術上存儲在nameString指向的內存塊中。當你的方法結束時,nameString指針只是從內存中清除。但是,名字仍然會指向那個記憶。如果您釋放nameString,它將清除名稱也指向的內存,因此如果您嘗試訪問與名稱關聯的內存,則會在稍後爲您提供問題。

2

我跑你的代碼通過谷歌翻譯的對象 - 英語過濾:

@synthesize name; 

親愛的編譯器:請創建一個setter和該物業的呼籲代表我name getter方法。

self.name = textInput.text; 

就拿這在textInput.text的對象,並使用以前創建的setter方法把它變成我的財產被稱爲name

NSString *nameString = name; 

創建一個新的變量,nameString,並在同一物點認爲name點。 (我沒有做任何影響對象內存管理的事情,我只想要一個新的標籤,我可以用它來引用對象。)

nameString = @"Cartman"; 

使我的變量nameString指向這個另一個對象,一個文字字符串。

(這並不變化的對象name點:
如果name -> OBJECT, 後
nameString = name,那麼也nameString -> OBJECT
但如果再nameString = OTHER_OBJECT,仍然name -> OBJECT。)

NSString *greeting = [[NSString alloc] 
        initWithFormat:@"Hello, my name is %@!", nameString]; 

NSString對象獲取大小正確的內存塊,並使用以下參數設置該內存:....將變量greeting在那個對象。由於我明確要求使用alloc這個內存,所以我對此負責。當我不再需要它時,我將release對象釋放內存。

label.text = greeting; 

就拿對象greeting點在那,並把它放在label的屬性稱爲textlabel應該在對象上做任何需要的內存管理;那部分不是我的問題。

[greeting release]; 

我不再需要我創建的那塊內存。擺脫它,趕快。

英語比Objective-C更有點兒字。 :)

+0

嗨,感謝您抽出寶貴時間向我解釋這一點。它確實幫助我瞭解代碼的功能。 P.S :(我不知道Obj-C到英文翻譯的位置,但我應該把它加入書籤:))) – Hidden 2011-06-09 07:33:24

+0

不客氣。在這種情況下還有什麼不清楚的地方? – 2011-06-09 07:34:50