2012-01-18 44 views
2

我有一個MBProgressHUD我分配如下:removeFromSuperview和釋放內存管理

self.progressHUD_ = [[[MBProgressHUD alloc] initWithView:self.view] autorelease]; 

如果我叫removeFromSuperview那麼我將不得不再次呼籲釋放progressHUD?另外,如果我聲明屬性像這樣的東西:

NSString * title_; 

@property (nonatomic, retain) NSString * title_; 

則可以保證在我的dealloc我應該對所有權的權利釋放?

回答

0

不,您不必再次釋放它。當您調用removeFromSuperview時,視圖將保留其子視圖並自動再次釋放它們。只要視圖在附加到視圖時已被自動釋放,它將在從視圖中移除時被釋放。

我不太明白你的第二個問題,但是,你必須在dealloc語句中釋放「retain」或「copy」類型的任何屬性。您必須手動編寫這些發佈聲明,它們不會自動添加(除非您正在使用ARC,我強烈建議)。

+0

嗯,基本上,如果我定義了保留在我的.h屬性,那我就必須釋放在我的dealloc,這是我的問題 – adit 2012-01-19 00:21:03

+0

那是正確的。 – 2012-01-19 00:57:38

+1

你最好用self.title_ = nil;在你的dealloc而不是[title_ release]中,因爲這減輕了title_先前發佈但尚未設置爲零的可能性,從而讓你釋放一個懸掛指針。 – paiego 2012-01-31 22:04:05

0

你的progressHUD_屬性是如何定義的? (順便說一句,伊娃應該有一個尾部下劃線,但不是屬性名稱)。

在情況下,它被定義爲(retain, whatever),你不得不再次釋放:

  1. 當你創建它,它retainCount是+1。
  2. 當您將其分配給您的財產時,其retainCount將增加1。
  3. 將其作爲子視圖添加到父視圖時,其retainCount將增加1。
  4. 在某些時候,autorelease最終會減少1,但視圖和屬性仍然保持。

因此,您必須將您的財產設置爲零,或者在您的dealloc方法中對伊娃調用release

此外,在定義NSString屬性時,您可能想使用copy而不是retain。是的:你必須以任何方式釋放它。

+0

它被定義爲@property(nonatomic,retain)progressHUD_; – adit 2012-01-19 00:21:26

+0

是的,你必須再次釋放它。另外,你可能想在你的h文件「progressHUD」中調用你的屬性,然後在你的m文件中說'@synthesize progressHUD = progressHUD_;':這種方式屬性被稱爲'progressHUD'和ivar'progressHUD_'。 – 2012-01-19 00:35:22

+0

或者我必須使用self才能訪問該產權? – adit 2012-01-19 01:00:28

1

如果progressHUD_是retain屬性,那麼您將不得不在dealloc中釋放它。然而,關於保留屬性的好處是,您只需將其設置爲即可回收內存;確保使用「自我」。之前。

e.g. 

self.<property_name> = nil; 

// or in your case 

self.progressHUD_ = nil; 

// the following will not release it because it's not accessing the property: 

progressHUD_ = nil 

我不推薦使用[progressHUD_ release],因爲它可能會導致問題。例如如果在其他地方發佈了progressHUD_並且沒有將其設置爲nil,則可能會意外釋放不再分配的指針(懸掛指針)。

我還建議在viewDidUnload中調用self.progressHUD_ = nil;,這是在低內存條件下調用並且未顯示視圖。它不會殺死你的類實例,而只是卸載視圖。和當然前提是你調用viewDidLoadself.progressHUD_ = [[[MBProgressHUD alloc] initWithView:self.view] autorelease];而非init...