0

我构建了一个 iPhone 应用程序,并注意到 XCode 中有分析工具。

我有这个代码:

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

并在交易中:

[progressSlider realese];

这也是我想做的吗?还是错了?

4

2 回答 2

7

您正在泄漏self.menuView,因为该属性被指定为retain。当你调用alloc一个对象时,它的保留计数设置为 1。当属性被分配时,它增加到 2,没有平衡调用来平衡它。

最简单的解决方法是调用-autorelease,如下所示:

self.menuView = [[[MenuView alloc] init] autorelease];

通过您的编辑,是的,该代码在表面上似乎是正确的。我真正的问题归结为为什么您仍在使用手动引用计数?是的 - 从表面上理解这是一件好事,但苹果已经弃用了它,转而支持更新的 ARC。

于 2013-01-17T13:51:58.517 回答
3

如果您保留一个属性,您应该在您的 dealloc 方法中向它发送一条释放消息:

- (void)dealloc {
    [menuView release];
    [super dealloc];
}

此外,您在分配 menuView 属性时分配/初始化。init 方法为您提供一个保留计数。设置该属性会使您的保留计数为 2。您应该有匹配数量的版本。您的设置代码应如下所示:

MenuView *m = [[MenuView alloc] init];
self.menuView = m;
[m release];
于 2013-01-17T13:50:59.430 回答