我构建了一个iPhone应用程序,并注意到XCode中有Analyze工具。
我有这段代码:
View * view = [[View alloc]initWithFrame:self.view.frame title:currentItem.name id:currentItem.idStr];
self.menuView = [[MenuView alloc]init];
self.menuView.contentView = view;
[view release];
和View
属性:
@property (retain,nonatomic) MenuView * menuView;
当我对项目进行分析时,我得到了这个潜在的泄漏警告。 我想知道它是否正常,分析只是警告我?或者我对代码犯了错误。
修改
如果我做这样的事情:
@property (retain, nonatomic) IBOutlet UISlider *progressSlider;
self.progressSlider = [[[UISlider alloc]initWithFrame:CGRectMake(58, 12, 191, 23)]autorealese];
[view addSubview:self.progressSlider];
并在dealloc中:
[progressSlider realese];
这也是我应该做的事情?或者这是错的?
答案 0 :(得分:7)
您正在泄漏self.menuView
,因为该属性已指定为retain
。当你在一个对象上调用alloc
时,它的保留计数被设置为1.当分配了属性时,它会增加到两个,没有平衡调用,甚至它都没有...
最简单的解决方法是调用-autorelease
,因此:
self.menuView = [[[MenuView alloc] init] autorelease];
通过编辑,是的,表面上的代码似乎是正确的。我真正的问题归结为你为什么还在使用手动引用计数?是的 - 从表面上理解它是一件好事,但是苹果已经将它简化为有利于更新的ARC。
答案 1 :(得分:3)
如果保留属性,则应在dealloc方法中向其发送一条释放消息:
- (void)dealloc {
[menuView release];
[super dealloc];
}
另外,在分配menuView属性时分配/ init。 init方法为您提供一个保留计数。设置属性会使保留计数为2。您应该有匹配数量的版本。您的设置代码应如下所示:
MenuView *m = [[MenuView alloc] init];
self.menuView = m;
[m release];