我在本地创建了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后释放对象。
答案 0 :(得分:0)
从技术上讲,这应该是一个有点正确的代码。这里的问题在于函数调用。分析看到:“无需发布即可分配”并提醒您。
尝试使用'alloc' - > 'init' - > “自动释放”。这样,当你不再使用它时,该对象将被释放。你将通过函数返回它,它将告诉编译器你仍然在使用它,并且只有在函数结束之后才会清理它,如果不是为了添加到子视图,则会在函数结束时调用它。
当子视图本身被销毁时,子视图将“释放”它的对象。
长话短说:
将自动释放添加到alloc并从调用方法中删除释放。 这应该可以解决你的问题。
答案 1 :(得分:0)
静态分析器会看到您释放从名为create...
的方法返回的对象。因此,它假定您没有对返回的对象的拥有引用。
如果您的方法被称为newLabel...
,则警告会消失,因为假设以new
(或alloc
或copy
)开头的方法会创建一个对象调用者负责释放。假定所有其他方法返回自动释放的对象。