我有一个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不应该创建视图的新实例吗?我不明白,花了很多时间阅读其他帖子以及查看记忆指南,我会说我彻底难倒!有人可以提供任何指示吗?我只发布了我认为必要的代码,但如果需要,我可以发布更多代码。 非常感谢!
答案 0 :(得分:1)
首先,你不应该同时调用[super init]
和[super initWithFrame:]
,只能调用UIView子类中的两个。
其次,您只应在self.view
方法中的视图控制器中设置-loadView
,该方法专为您创建视图而设计。通常,除非您需要进行某些类型的设置,例如初始化变量等,否则您不需要在UIViewController子类中覆盖-init
。
答案 1 :(得分:0)
最后,在今晚再次使用该代码后,我终于开始工作了。我没有发布的关键部分似乎是
[self.view release];
我认为这是完全合理的,因为我将视图添加为此自我视图的子视图,但我之前尝试过这个。也许清理代码是这次工作的原因。