似乎无法重新分配已发布的U​​IView

时间:2010-02-08 03:48:31

标签: objective-c memory-management uiview

我有一个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不应该创建视图的新实例吗?我不明白,花了很多时间阅读其他帖子以及查看记忆指南,我会说我彻底难倒!有人可以提供任何指示吗?我只发布了我认为必要的代码,但如果需要,我可以发布更多代码。 非常感谢!

2 个答案:

答案 0 :(得分:1)

首先,你不应该同时调用[super init][super initWithFrame:],只能调用UIView子类中的两个。

其次,您只应在self.view方法中的视图控制器中设置-loadView,该方法专为您创建视图而设计。通常,除非您需要进行某些类型的设置,例如初始化变量等,否则您不需要在UIViewController子类中覆盖-init

答案 1 :(得分:0)

最后,在今晚再次使用该代码后,我终于开始工作了。我没有发布的关键部分似乎是

[self.view release];

我认为这是完全合理的,因为我将视图添加为此自我视图的子视图,但我之前尝试过这个。也许清理代码是这次工作的原因。