7

xCode 4.3 のメモリ リーク インストルメントに非常に奇妙な問題があります... 基本的に、次の場合は機能しません...

  1. プロジェクトは ARC サポートなしで作成されます。
  2. UIViewを継承するシンプルなクラスを作成する
  3. 「ボタン」を使用してこのクラスのインスタンスを作成し、それを「リーク」します...リークはLeak Instrumentsによってキャッチされません

これがPROBLEMATICクラスのコードです

@interface LeakTestView :  UIView
- (id)initWithFrame:(CGRect)frame;
@end

@implementation LeakTestView
- (id)initWithFrame:(CGRect)frame
{
    NSLog(@"initWithFrame called");
    self = [super initWithFrame:frame];
    if (self) {

        // Initialization code
    }
    return self;
}
@end

そして今、私はリークを作成します...

- (IBAction)leak:(id)sender {
    LeakTestView* leak=[[LeakTestView alloc]initWithFrame:CGRectMake(0, 0, 100, 100)];
    NSLog(@"class is %@", [leak class]);
}

問題は、このリークが検出されないことです...

基本クラスを NSObject に変更し、initWithFrame オーバーライド init の代わりに (以下を参照)、リークが検出されます....

これが検出されるリークのコードです

@interface LeakTestView : NSObject
- (id) init;
@end


@implementation LeakTestView

- (id) init {
    NSLog(@"init called");
    self = [super init];
    if (self) {

    }
    return self;
}
@end

ここでオブジェクトを作成してそのままにしておくと、リーク検出がトリガーされ、リークがインストルメントに「表示」されます。

- (IBAction)leak:(id)sender {
    LeakTestView* leak=[[LeakTestView alloc]init];
    NSLog(@"class is %@", [leak class]);
}

何が起こっているのですか?UIView サブクラスのリークが検出されないのに、基本クラスを NSObject に変更すると問題が「修正」されるのはなぜですか? ああ、はい、リークされたオブジェクトは「マークヒープ」を使用して見ることができます-リークの前に1つのマーク、ボタンをクリックしてリークを作成した後に1つのマーク-クラスはヒープデルタに表示されます...

編集:もう1つの「面白い」状況...「init」のものを削除すると(オブジェクトのみを割り当てます)

LeakTestView* leak=[LeakTestView alloc];

その後、基本クラスが何であれ、リークが検出されます...一体何が起こっているのでしょうか?

EDIT2:もう1つの「面白い」こと。リーク検出の問題は、シミュレータ (iOS 5.0、9A334 は私のもの) でのみ観察できますが、iPad デバイスを使用している場合、リークは常に検出されます...

コメントはありますか?問題がない場合、または私が「嘘をついている」と考えている場合は、私が間違っていることを教えてください。上記のケースは「問題なく」機能しています。

4

1 に答える 1

0

多分それは漏れていませんか?

ブラックボックスであるメソッドを呼び出しています。UIView initWithFrameの実装方法は、あなたの仕事ではありません。ある種の契約がありますが、保持数が1であると想定できる以上に、これをリークするように要求する権利はありません。

リークは便利なツールですが、思ったとおりには機能しません。それはあなたが台無しにしたときあなたに教えてくれません。到達不能な割り当てがある場合に通知します。これは同じことではありません。

または、バグの可能性があります。

于 2012-02-28T10:53:56.170 に答える