XCode 4.5分析工具

时间:2013-01-17 13:47:18

标签: ios objective-c memory-leaks

我构建了一个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];

这也是我应该做的事情?或者这是错的?

2 个答案:

答案 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];