2010-02-08 46 views
0

我有我創建程序大致是這樣一個UIView:似乎無法能夠重新ALLOC釋放的UIView

@implementation SlideShowView 
- (id)initWithImages 
{ 
    … 
    if (self=[super initWithFrame:CGRectMake(0, 0, 320, 480)]) 
    { 
     // init objects here 
    } 
    return self; 
} 
- (void)dealloc 
{ 
    printf("dealloc slide show view\n"); 
    [[NSNotificationCenter defaultCenter] removeObserver:self name:@"unlockUI" object:nil ]; 
    [[NSNotificationCenter defaultCenter] removeObserver:self name:@"setUserRating" object:nil ]; 
    [mCurrentImageView release]; 
    [mRightImageView release]; 
    [mLeftImageView release]; 
    [mImages release]; 
    [queue cancelAllOperations]; 
    [queue release]; 
    [managingArray release]; 
    [super dealloc]; 
} 

與包含此一個UIView控制器:

- (void)loadView { 
{ 
    ... 
    self.view = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 320, 480)]; 
    self.slideShowViewObject = [[SlideShowView alloc] initWithImages]; 
    [self.view addSubview:slideShowViewObject]; 
    … 
} 
-(void)dealloc 
{ 
    [slideShowViewObject release]; 
    [self.slideShowViewObject removeFromSuperview]; 
    printf("dealloc of slideshow view controller\n"); 
    [super dealloc]; 
} 

這似乎能夠釋放視圖控制器和視圖,但是當我將這個視圖控制器重新放回堆棧時,我得到帶有殭屍的消息: - [SlideShowView retain]:發送到釋放實例的消息0x43ab160

當控制器被按下時,alloc不應該創建視圖的新實例嗎?我不明白,花了好幾個小時閱讀其他帖子以及看內存指南後,我會說我徹底難倒了!有人可以提供任何指針嗎?我只發佈了我認爲必要的代碼,但如果需要的話,我可以發佈更多代碼。 非常感謝!

回答

1

首先,您不應該同時調用[super init][super initWithFrame:],它們只是UIView子類中兩個中的一個。

其次,您應該只在-loadView方法中的視圖控制器中設置self.view,該方法是爲您創建視圖而設計的。通常,除非需要執行某些類型的設置,如初始化變量等,否則不應在UIViewController子類中重寫-init

+0

感謝您的回覆。我已經對我的代碼以及上面的帖子進行了編輯。我仍然有同樣的問題。你可能有其他建議嗎? – Dobler 2010-02-08 06:32:36

0

終於,在今晚再次與代碼一起折騰之後,我終於找到了工作。我不釋放出現的關鍵部分是

[self.view release]; 

我想這是非常合情合理的,因爲我加入的觀點,因爲這alloc'd自我視圖的子視圖,但我以前試過這一點。也許清理代碼是這次它的工作原理。