2012-05-25 38 views
2

我很迷茫的內存管理。iOS:我應該釋放dealloc函數中的對象嗎?

聲明的變量allNoticeArray在.h文件中:

@interface NoticeViewController : UITableViewController 
{ 
    NSMutableArray *allNoticeArray;  
} 
@property (nonatomic, retain) NSMutableArray *allNoticeArray; 
@end 

的Alloc和INIT在.m文件變量:

@implementation NoticeViewController 
@synthesize allNoticeArray; 
- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 
    self.allNoticeArray = [[[NSMutableArray alloc] init] autorelease]; 
} 
- (void)dealloc 
{ 
    [super dealloc]; 
    /* 
     ***should I release allNoticeArray here or not?*** 
    */ 
    //[allNoticeArray release]; 
} 

我應該釋放allNoticeArray中的dealloc功能或沒有?

預先感謝您!

回答

2

當不使用ARC時,應該在dealloc中使用該版本。你說得對.h文件中的保留將保留計數增加1。 Alloc/Init創建一個保留計數爲1的對象。自動釋放會反擊保留,但是你的dealloc版本會計算.h中的保留。

設置self.allNoticeArray = nil;與發行版不一樣,但是來自sElan的鏈接是一個很好的鏈接。

+0

謝謝你的幫助 – jxdwinter

+0

@SuperGuyAbe你能告訴我爲什麼設置財產無法在這裏工作?如果你指定nil,setter將釋放場景後面的對象。它可以安全地以這種方式進行發佈,畢竟這裏已經使用了一個屬性。 – sElanthiraiyan

+0

@sElanthiraiyan謝謝你給我打電話,我發現了一篇非常明確的文章,它涵蓋了我的推理,但也闡明瞭你對self.allNoticeArray = nil的特別建議實際上可行。在一般情況下,object = nil不會釋放,但會在屬性上釋放。鏈接是[here](http://tinyurl.com/7zzl8pl) – SuperGuyAbe

3

它看起來像你手動管理你的內存,而不是使用ARC。

如果你使用的是IOS5,那麼你可能會更容易convert your project to ARC,那麼你不必擔心在這種情況下的dealloc。

如果您不想使用ARC,您需要在此上下文中釋放它,因爲您已將其分配在viewDidLoad中。您可能也有興趣關於dealloc的this article

+0

這個應用程序,我不使用ARC,如果不釋放allallotArray dealloc函數,是否有泄漏? – jxdwinter

+0

如果你在dealloc中沒有釋放allNoticeArray,那麼是的,會有泄漏。 autorelease平衡分配,但仍需要釋放dealloc,因爲您使用setter將保留計數增加1。 – glenstorey

+0

謝謝,我將在dealloc中釋放NSMutableArray。 – jxdwinter

1

簡短的回答是NO,但是你正在做一些不推薦的事情。在你的代碼中,你在單行中保留你的數組兩次。在下面的代碼中,它只保留一次。

你應該初始化數組像這樣 -

NSMutableArray *array = [[NSMutableArray alloc] init] autorelease]; 
self.allNoticeArray = array; 

我建議你考慮使用ARC,它使內存管理非問題在IOS 5

+0

我保留.h文件中的allNoticeArray並將其分配到.m中,所以如果不在dealloc中釋放它,這是泄漏嗎? – jxdwinter

+1

我不明白這是如何改變的。 OP有什麼是完全可以接受的。如果最終沒有autorelease,它會被保留兩次,但它確實如此。事實上,它與你的減去一個額外的變量相同。 – borrrden

+0

這是不一樣的。當你分配一個init屬性時,retain被調用兩次,當你初始化它時,一次你設置它。在我的代碼中,retain只被調用一次。 – Dmorneault

2

預ARC內存的規則管理是這樣的:如果你分配,保留或複製一個對象,你必須稍後釋放它,否則它會泄漏。你的財產將被保留,所以它保留的任何價值都將被保留。你必須在dealloc中使用release來平衡它。

3

是的,你必須釋放對象。你可以在你的dealloc方法中執行下面的命令,釋放你的對象。

self.allNoticeArray = nil; 

原因: 雖然你已經自動釋放你已經宣佈你的財產作爲保留陣列。所以該對象將被保留和使用。所以要完全從內存中刪除對象,你應該再次調用釋放它。 您可以在此處瞭解有關內存管理的所有信息https://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/MemoryMgmt/Articles/MemoryMgmt.html

相關問題