2010-02-08 43 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自我视图的子视图,但我以前试过这一点。也许清理代码是这次它的工作原理。