0

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

メソッドで Autorelease を使用"createlabel"すると問題が解決することはわかっています。サブビューに追加されたオブジェクトを解放する最良の方法と方法を知りたいです。

4

2 に答える 2

0

技術的には、これはやや正しいコードである必要があります。ここでの問題は関数呼び出しにあります。Analyzeは、「リリースなしで割り当て」を確認し、そのことを警告します。

'alloc'->'init'->'autorelease'を使用してみてください。そうすれば、オブジェクトは、使用しなくなった瞬間に解放されます。関数によって返されます。これにより、コンパイラにまだ使用中であり、サブビューに追加しない場合は、関数が最後に呼び出された後にのみクリーンアップされることが通知されます。

サブビュー自体が破棄されると、サブビューはそのオブジェクトを「解放」します。

長い話を短くするには:

割り当てに自動リリースを追加し、呼び出し元のメソッドからリリースを削除します。それはあなたの問題を解決するはずです。

于 2012-11-19T07:11:09.540 に答える
0

静的アナライザーは、 というメソッドから返されたオブジェクトを解放していることを確認しますcreate...。したがって、返されたオブジェクトへの所有参照がないことが前提となります。

代わりにメソッドが呼び出された場合、(またはまたは)newLabel...で始まるメソッドは、呼び出し元が解放する責任があるオブジェクトを作成すると想定されるため、警告は消えます。他のすべてのメソッドは、自動解放されたオブジェクトを返すと想定されています。newalloccopy

于 2012-11-19T07:46:16.943 に答える