2011-01-11 104 views
0

我在.H以下代碼:iPhone權的方式來設置屬性

@property (nonatomic, retain) NSArray *arrayData; 

,並在方法initWithNibName的.M:

self.arrayData = [NSArray arrayWithObjects:@"Usuario:",@"Password:",nil]; 

是不是爲了打電話

[self.arrayData release] 

安全地爲了釋放對象?

回答

1

不,這是不正確的呼叫釋放你的財產。問題是,你釋放你的財產,它會被釋放,但你沒有設置你的指針爲零,所以有人可能會發送消息到你的財產並導致崩潰。

你可以做的是:

  1. self.arrayData =零; (這將釋放先前保存的實例,並將屬性設置爲零)
  2. [arrayData release]; arrayData = nil; (在這裏你正在訪問你的伊娃,而不是你的財產;設置你的伊娃爲零是預防措施)
  3. [self-> arrayData release]; self> arrayData = nil(這與#2完全一樣)

希望這會有所幫助。

+0

將屬性中的對象設置爲零也會向其發送一個釋放?哇。 – 2011-01-11 23:17:32

+0

okey它的工作原理是什麼,但設置arrayData的正確方法是什麼? self.arrayData = [NSArray ....]或 arrayData = [NSArray ....] 謝謝 – xger86x 2011-01-11 23:18:54

1

你需要調用:

[arrayData release] 

調用[self.arrayData發佈];在任何情況下都不會產生你想要的效果。

如果你想知道這是爲什麼,看看這個問題了:difference between [self.property release] and [property release]

+0

答案標記爲正確的這個問題是不正確。我剛剛就答案的原因進行了評論。 – Moszi 2011-01-11 23:13:15

1

A) 這是一個壞主意在你的初始化(例如,initWithNibName要做到這一點:捆綁:)

self.arrayData = [NSArray arrayWithObjects:@"Usuario:",@"Password:",nil]; 

用這個代替:

arrayData = [[NSArray alloc] initWithObjects:@"Usuario:",@"Password:",nil]; 

,你不應該調用這些訪問(屬性)在初始化程序或dealloc中。

B)

是不是爲了調用

[self.arrayData釋放]

沒有。在許多情況下(假設你實施了你宣佈的一些屬性),你可能不會被退回伊娃。您可能會收到副本,佔位符對象或可能選擇重新實現訪問器的子類(如一些示例)。在這些情況下,很容易過度釋放或過度保留(導致邪惡的東西,如泄漏和崩潰)。

這是典型的:

self.arrayData = nil; 

除非你是在宣告伊娃對象的dealloc

- (void)dealloc { 
    [arrayData release], arrayData = nil; 
    [super dealloc]; 
} 
相關問題