如何在将视图对象添加为子视图后释放视图对象:修复内存泄漏

时间:2012-11-19 07:06:14

标签: iphone objective-c cocoa-touch ios6

我在本地创建了UILabel,并将其作为subview添加到我的视图中。 出现以下问题: 1)执行"Analyze"编译器显示"incorrect decrement of the reference count of the object" 2)我观察到保留计数不为零。 这是我的代码:

-(UILabel*)createLabel:(CGRect)rect labelText:(NSString *)labelText {
UILabel *label = [[UILabel alloc] initWithFrame:rect];
label.text = labelText;
return label;
}
- (void)initMyView {
UILabel *label = [self createLabel:rect labelText:circuitName];
NSLog(@"before using %d", [label retainCount]);
[self.heatingCircuitsScrollView addSubview:label];
NSLog(@"before release %d", [label retainCount]);
[label release];
NSLog(@"After release %d", [label retainCount])
}

我在我的控制台中获得以下内容:

使用1之前 在发布之前2 发布1后

我知道在"createlabel"方法上使用Autorelease解决了这个问题。我想知道哪个是最佳方法以及如何在添加到Subview后释放对象。

2 个答案:

答案 0 :(得分:0)

从技术上讲,这应该是一个有点正确的代码。这里的问题在于函数调用。分析看到:“无需发布即可分配”并提醒您。

尝试使用'alloc' - > 'init' - > “自动释放”。这样,当你不再使用它时,该对象将被释放。你将通过函数返回它,它将告诉编译器你仍然在使用它,并且只有在函数结束之后才会清理它,如果不是为了添加到子视图,则会在函数结束时调用它。

当子视图本身被销毁时,子视图将“释放”它的对象。

长话短说:

将自动释放添加到alloc并从调用方法中删除释放。 这应该可以解决你的问题。

答案 1 :(得分:0)

静态分析器会看到您释放从名为create...的方法返回的对象。因此,它假定您没有对返回的对象的拥有引用。

如果您的方法被称为newLabel...,则警告会消失,因为假设以new(或alloccopy)开头的方法会创建一个对象调用者负责释放。假定所有其他方法返回自动释放的对象。