0

我在UILabel本地创建了一个并将其添加subview到我的视图中。出现以下问题:1)执行"Analyze"编译器显示a "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 可以解决问题。我想知道哪个是最好的方法,以及如何在将对象添加到子视图后释放它。

4

2 回答 2

0

从技术上讲,这应该是一个正确的代码。这里的问题在于函数调用。分析看到:'alloc without release' 并提醒你。

尝试使用'alloc' -> 'init' -> 'autorelease'。这样,该对象将在您不再使用它的那一刻被释放。您将通过函数返回它,这将告诉编译器您仍在使用它,并且仅在函数结束后才将其清理,该函数被调用结束,如果不是为了添加到子视图。

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

长话短说:

将 autorelease 添加到 alloc 并从调用方法中删除 release。那应该可以解决您的问题。

于 2012-11-19T07:11:09.540 回答
0

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

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

于 2012-11-19T07:46:16.943 回答