我有一個實例變量聲明爲保留屬性&然後我釋放它2次。釋放後我不使用它。這不會導致任何崩潰。有沒有釋放變量超過所需的(假設變量是不會釋放後使用)任何其他影響:釋放一個變量的影響,然後保留計數
@property (nonatomic, retain) NSString *myVariable;
self.myVariable = nil;
self.myVariable = nil;
我有一個實例變量聲明爲保留屬性&然後我釋放它2次。釋放後我不使用它。這不會導致任何崩潰。有沒有釋放變量超過所需的(假設變量是不會釋放後使用)任何其他影響:釋放一個變量的影響,然後保留計數
@property (nonatomic, retain) NSString *myVariable;
self.myVariable = nil;
self.myVariable = nil;
您可能會對變量和對象之間的區別感到困惑。一個變量可以與釋放無限次地一起使用(比如,如果是零,或者它在每次釋放前擁有一個完全不同的保留對象,等等。這是因爲一個變量不能容納對象,或者不同的對象在不同的位置次)。在你的例子中,變量在第二次發佈期間不包含對象(nil)。
但是釋放任何一個非零對象只是一次太多可能是導致崩潰的原因。
你是不是,其實,釋放它的兩倍。這是因爲你正在使用屬性。你第一次打電話給self.myVariable = nil
,你會發布它(假設它有價值)。但第二次,它已經沒有,所以沒有什麼可發佈的。
一般來說,實際上多次釋放對象(或者更確切地說,釋放的次數多於保留次數)非常糟糕,幾乎肯定會導致應用程序崩潰。
你實際上並沒有釋放它兩次。鑑於制定者看起來是這樣的:
- (void)setMyVariable:(NSString)value
{
[myVariable release];
myVariable = [value retain];
}
第一self.myVariable = nil
將釋放myVariable
伊娃,同時也將其設置爲零。接下來的self.myVariable = nil
什麼都不會做,因爲[nil release]
什麼都不做。
實際上,過度釋放對象會(通常)導致崩潰。
代碼中不會發生任何事情。我假設你正在使用ARC(自動引用計數),所以你通過將它的指針設置爲零來「釋放」它。
它是如何工作的,假設你有一個NSString對象分配在內存中,你創建它併爲它指定一個指針。
所以現在你的指針指向那個對象,這個弧是什麼:如果一個對象不再有指向它的指針,它會自動釋放。假設你只有那個NSString上的「myvariable」指針,那麼它將在你設置爲零的那一刻被釋放。
如果您將myvariable重新設置爲零,那麼您完全沒有做任何事情,因爲該對象之前已經發布。
請注意,這意味着如果你有另一個指向該NSString的變量,那麼對象WONT將被釋放,但myvariable不會再指向它。
我忘了提及,你可以找到關於弧如何在Ray Wenderlich的「iOS 5 by tutorials」中工作的極好解釋。
PD:如果您正在使用ARCü應該改變你的
@屬性(非原子,保留)的NSString * MYVARIABLE;
到
@屬性(非原子,強)的NSString * MYVARIABLE;
隨着iOS 5中新的ARC(自動引用計數),你不應該擔心這個問題,因爲編譯器負責這個。
瞭解更多關於在這裏: http://clang.llvm.org/docs/AutomaticReferenceCounting.html
但是,如果你不能/不想使用ARC,這是我的備選答案:
通過訪問瓦爾你的方式(self.var = nil
),我的猜測是,這些綜合功能照顧不釋放非保留變種,所以你可以安全地做到這一點,儘可能多的你喜歡(雖然不是很優雅)。
另一方面,如果您明確地要求釋放像這樣的[var release]
兩次或更多版本,您可能會遇到非常討厭的問題。
您似乎對對象和變量之間的差異感到困惑。如果變量爲零,則變量可以釋放無數次。而任何時候只釋放一個非零對象都會導致崩潰。 – hotpaw2 2012-02-17 01:20:22
我認爲你是對的。你可以把這個作爲答案,以便我可以將其標記爲接受。 – Abhinav 2012-02-17 01:42:15