2012-02-17 84 views
0

我有一個實例變量聲明爲保留屬性&然後我釋放它2次。釋放後我不使用它。這不會導致任何崩潰。有沒有釋放變量超過所需的(假設變量是不會釋放後使用)任何其他影響:釋放一個變量的影響,然後保留計數

@property (nonatomic, retain) NSString *myVariable; 
self.myVariable = nil; 
self.myVariable = nil; 
+1

您似乎對對象和變量之間的差異感到困惑。如果變量爲零,則變量可以釋放無數次。而任何時候只釋放一個非零對象都會導致崩潰。 – hotpaw2 2012-02-17 01:20:22

+0

我認爲你是對的。你可以把這個作爲答案,以便我可以將其標記爲接受。 – Abhinav 2012-02-17 01:42:15

回答

1

您可能會對變量和對象之間的區別感到困惑。一個變量可以與釋放無限次地一起使用(比如,如果是零,或者它在每次釋放前擁有一個完全不同的保留對象,等等。這是因爲一個變量不能容納對象,或者不同的對象在不同的​​位置次)。在你的例子中,變量在第二次發佈期間不包含對象(nil)。

但是釋放任何一個非零對象只是一次太多可能是導致崩潰的原因。

4

你是不是,其實,釋放它的兩倍。這是因爲你正在使用屬性。你第一次打電話給self.myVariable = nil,你會發布它(假設它有價值)。但第二次,它已經沒有,所以沒有什麼可發佈的。

一般來說,實際上多次釋放對象(或者更確切地說,釋放的次數多於保留次數)非常糟糕,幾乎肯定會導致應用程序崩潰。

2

你實際上並沒有釋放它兩次。鑑於制定者看起來是這樣的:

- (void)setMyVariable:(NSString)value 
{ 
    [myVariable release]; 
    myVariable = [value retain]; 
} 

第一self.myVariable = nil將釋放myVariable伊娃,同時也將其設置爲零。接下來的self.myVariable = nil什麼都不會做,因爲[nil release]什麼都不做。

實際上,過度釋放對象會(通常)導致崩潰。

0

代碼中不會發生任何事情。我假設你正在使用ARC(自動引用計數),所以你通過將它的指針設置爲零來「釋放」它。

它是如何工作的,假設你有一個NSString對象分配在內存中,你創建它併爲它指定一個指針。

所以現在你的指針指向那個對象,這個弧是什麼:如果一個對象不再有指向它的指針,它會自動釋放。假設你只有那個NSString上的「myvariable」指針,那麼它將在你設置爲零的那一刻被釋放。

如果您將myvariable重新設置爲零,那麼您完全沒有做任何事情,因爲該對象之前已經發布。

請注意,這意味着如果你有另一個指向該NSString的變量,那麼對象WONT將被釋放,但myvariable不會再指向它。

我忘了提及,你可以找到關於弧如何在Ray Wenderlich的「iOS 5 by tutorials」中工作的極好解釋。

PD:如果您正在使用ARCü應該改變你的

@屬性(非原子,保留)的NSString * MYVARIABLE;

@屬性(非原子,強)的NSString * MYVARIABLE;

0

隨着iOS 5中新的ARC(自動引用計數),你不應該擔心這個問題,因爲編譯器負責這個。

瞭解更多關於在這裏:​​ http://clang.llvm.org/docs/AutomaticReferenceCounting.html

但是,如果你不能/不想使用ARC,這是我的備選答案:

通過訪問瓦爾你的方式(self.var = nil),我的猜測是,這些綜合功能照顧不釋放非保留變種,所以你可以安全地做到這一點,儘可能多的你喜歡(雖然不是很優雅)。

另一方面,如果您明確地要求釋放像這樣的[var release]兩次或更多版本,您可能會遇到非常討厭的問題。

相關問題