2011-11-18 71 views
1

我已經旋轉了2個小時了,所以我想在這裏發佈一些建議。Autorelease造成應用程序崩潰

以我viewDidLoad方法,我做的:

 
UIScrollView *scrollView = [[UIScrollView alloc] initWithFrame:CGRectMake(0, 0, 320, 600)]; 
... 
UIView *contactsRow = [self generateContactsRow]; 
contactsRow.frame = CGRectMake(10, tableMaxY, 300, 56); 
... 
[scrollView addSubview:contactsRow]; 
[self.view addSubview:scrollView]; 
[scrollView release]; 

在[自generateContactsRow],我基本上創建一個容器視圖,加載一串內的其它次(按鈕,標記,等等),並返回它。

 
UIView *containerView = [[[UIView alloc] initWithFrame:CGRectMake(0, 0, 300, 0)] autorelease]; 
... (define stuff) 
// set it 
[containerView addSubview:imageView]; 
[containerView addSubview:textLabel]; 
[containerView addSubview:detailTextLabel]; 
[containerView addSubview:addButton]; 
[containerView addSubview:hr]; 

// and forget it 
[imageView release]; 
[textLabel release]; 
[detailTextLabel release]; 
[addButton release]; 
[hr release]; 

return containerView; 

事實上,我正在autoreleasing containerView導致我的應用程序崩潰。我返回一個alloc'd對象,所以我想我必須以某種方式釋放它,autorelease似乎是最好的方法。如果我刪除它,事情工作正常,但我不會有內存泄漏?

感謝

+0

代碼看起來正確。你打開了NSZombieEnabled標誌,看看是否真的如此? –

+0

您發佈的代碼段在內存管理方面是正確的。你如何初始化你添加到containerView的對象?嘗試運行靜態分析器,看看它是否捕獲任何東西。 – titaniumdecoy

+2

使用return [containerView autorelease];並從UIView初始化中刪除autorelease。 –

回答

2

做類似下面的

UIScrollView *scrollView = [[UIScrollView alloc] initWithFrame:CGRectMake(0, 0, 320, 600)]; 
... 
UIView *contactsRow = [[self generateContactsRow] retain]; 
contactsRow.frame = CGRectMake(10, tableMaxY, 300, 56); 
... 
[scrollView addSubview:contactsRow]; 
[self.view addSubview:scrollView]; 
[contactsRow release]; 
[scrollView release]; 

段我在這裏保留了contactsRow和釋放後,我把它作爲子視圖滾動視圖。所以不會有任何內存泄漏。

+0

我的答案解決了你的問題嗎? – Ilanchezhian

+0

嗨gomathi,這是阿倫,你從哪裏來,你工作,這是arun在欽奈工作,ios dev – Marios

+1

另外,檢查一件事。您正在'generateContactsRow'方法中釋放'addButton'。請檢查您是否正在分配對象。 – Ilanchezhian

0

您可以在viewdidunload或viewwillDisapper方法中釋放它...