2011-08-08 62 views
0
@interface MyViewController : UIViewController { 
    UITextField *textField; 
} 
@property (nonatomic, retain) UITextField *textField; 

UITextField *aTextField = [[UITextField alloc] init]; 
self.textField = aTextField; 
[aTextField release]; 

我不知道爲什麼aTextField是必要的。我不能這樣寫嗎?爲什麼分配時需要臨時變量?

@property (nonatomic, assign) UITextField *textField; 

self.textField = [[UITextField alloc] init];  

回答

0
@property (nonatomic, assign) UITextField *textField; 

self.textField = [[UITextField alloc] init]; 

從上@bbum答案評論:

我沒有挽留。我被分配財產。在 作業後保留計數爲1。我只需要釋放一次dealloc。

不要這樣做!

好吧,如果在它們之間什麼也沒有發生的話,那就不會泄漏(屬性是assign!)但這違背了對象所有權的基本知識。

標記爲assign的屬性用於您不擁有的對象,例如代表。因此,根據內存管理規則您不得放棄您不屬於的對象的所有權。

通過這樣做,您將陷入許多麻煩,因爲您依賴於實現細節,事實上,您知道您創建了該對象並且需要釋放它。你不想把自己置於這個位置。如果您以後設置另一個對象會怎樣?你會泄漏前者,並可能過度釋放後者,導致潛在的崩潰。

+0

如果我這樣使用可以嗎? textField = [[UITextField alloc] init]; – user698200

+0

我只能在初始化程序和'dealloc'中直接訪問伊娃。我會通過其他地方的財產訪問者。無論如何''textField = [[UITextField alloc] init];'只要釋放'textField'可能指向的任何前一個對象就可以。 – albertamg

+0

我還不完全知道。無論如何,謝謝。 – user698200

5

澄清:認爲保留和釋放爲增量;對於每一條暗示保留的聲明,您都必須有一個平衡釋放。保留是「保持這個對象活着直到平衡釋放」的聲明。

差不多;你需要(假設@property(retain) UITextField *textField;):

textField = [[UITextField alloc] init]; // +1 retain 

或者:

self.textField = [[[UITextField alloc] init] autorelease]; // +1, +1, -1 (delayed) 

唯一的區別是,上面是直接分配和未使用的setter保留的對象。

如果你做的事:

self.textField = [[UITextField alloc] init]; // +1 +1 

你會泄漏的對象。

而且,是的,在正確的情況下,你需要:

self.textField = nil; 

或者:

[textField release]; 

在你dealloc


哦 - 對不起 - 我錯過了assign上第二@property聲明。

總之,不要那樣做。這是一個薄弱的參考,很容易變成搖晃。它有它的用途,可悲的是,它們比它們應該更普遍(對象圖中的銀行指針,最常見的是,儘管代表們也使用它們)。我上面寫的東西依然存在;考慮保留爲三角洲,在assign的情況下,沒有+1並且沒有任何可以平衡的地方。

但是,在這種情況下,assign也很可能是不正確的;你想要retain。你可能使用assign和管理外部保留/釋放,但這是非典型的和脆弱與充滿。屬性上存在retain專門用於表示所有權!

+0

我會在dealloc中發佈。 – user698200

+0

即使我在dealloc中發佈它有問題嗎? – user698200

+0

我沒有保留。我被分配財產。分配後保持計數爲1。我只需要釋放一次dealloc。我還是不明白。 – user698200

相關問題