2011-09-07 81 views
0

我已將UIView作爲工具欄進行子類化,並將各種按鈕和其他視圖添加到類中。現在,在我的ViewController頭我有這樣的:調用釋放方法崩潰iOS應用程序

@interface GridViewController : UIViewController <UIWebViewDelegate, UIScrollViewDelegate> { 
    Toolbar *toolbar; 
} 

@property (retain) Toolbar *toolbar; 

,並在執行我有這樣的:

@synthesize toolbar; 

- (void)viewDidLoad { 
    [super viewDidLoad]; 
    CGRect toolbarRect = CGRectMake(0, 0, 1024, 40); 
    self.toolbar = [[Toolbar alloc] initWithFrame:toolbarRect]; 
    [self.view addSubview:toolbar]; 
} 

- (void) dealloc { 
    [toolbar release]; 
    [super dealloc]; 
} 

現在,如果我運行分析,它基本上是說,我有一個潛在的內存泄漏。如果我添加[工具欄釋放];在調用addSubView:工具欄後,像我通常在添加子視圖時一樣,當我彈出ViewController時,應用程序崩潰。

我在做什麼錯?我試過閱讀所有關於內存管理的知識,並且根據這些,你總是必須釋放/自動釋放你分配/複製/保留的東西等。如果我看看我的代碼,我在頭文件中保留了實例變量,還在實現中分配它,所以保留計數應該是+2,因此我需要釋放它兩次,但似乎我誤解了一些東西。很感謝任何形式的幫助。

當我說一聲,我得到這個:Xcode的暫停,並說EXC_BAD_ACCESS此行的main.m

int retVal = UIApplicationMain(argc, argv, nil, nil); 

,並在控制檯中我得到這個:

modifying layer that is being finalized - 0x60895f0 
+0

對於引用計數應爲+3。一個用於alloc,另一個用於保留self.property,另一個保留在addSubview中。你說當你在addSubview之後添加release語句時它在pop中崩潰,你能發佈這個錯誤的堆棧跟蹤嗎? – Saran

+0

將問題信息添加到問題中。 – margusholland

+0

如何在殭屍樂器下運行你的應用程序?這將幫助您識別您正在訪問的對象,該對象已經發布。 – Saran

回答

0

看來問題實際上是在工具欄類而不是ViewController。我沒有爲伊娃隊使用二傳手,因此開始打破。

0

如果屬性self.toolbar設置爲(retain)它表明在行self.toolbar = [[Toolbar alloc] initWithFrame: toolbarRect];之後保留計數應該是+2。我建議用self.toolbar = [[[Toolbar alloc] initWithFrame: toolbarRect] autorelease]替換該行以使保留計數保持爲1.這應該可以解決該問題,因爲來自addSubview的保留不受您管理,並且您在dealloc中釋放toolbar

所有帶保留setter的屬性都應該被賦予一個自動釋放對象。

+0

不,最終結果與之前相同 - 在popViewController上崩潰 – margusholland