2011-09-11 12 views
0

と自動解放使用することができない私は、このコード「様」静的分析を行うことができないが、同時に私は、コントローラに格納されますオブジェクトを自動解放することができないので、発信者のために役に立ちません。これらの2つの静的メソッドを使用して、(タブをブロックすることなく)どのビューにもアクティビティコントローラを表示しやすくしました。メモリリークの可能性; UIViewController

PZActivityOverlayController *view = [PZActivityOverlayController displayOverView:self.view]; 
// Later on, when complete 
[PZActivityOverlayController remove:view]; 

オリジナルコード:

+ (PZActivityOverlayController *)displayOverView:(UIView *)aView { 
    PZActivityOverlayController *controller = [[PZActivityOverlayController alloc] initWithFrame:aView.superview.bounds labelText:@"Loading"]; 
    [controller viewWillAppear:YES]; 
    [aView.superview insertSubview:controller.view aboveSubview:aView]; 
    return controller; // Potential leak of object stored into controller 
} 

+ (void)remove:(PZActivityOverlayController *)display { 
    [display viewWillDisappear:YES]; 
    [display.view removeFromSuperview]; 
    [display release]; // However it won't leak because it gets released here 
} 

はおそらく、私がここで間違って責任のチェーンを持っているが、それは便宜のためだけです。代わりに、これらのメソッドの本体にあるものをどこにでも書き込むことになります(これはDRYには多すぎるものです)。

+0

できないのはなぜあなたオートリリース** [コントローラの自動リリース] **?それはクラッシュするのだろうか? –

+0

呼び出し元が+ removeを呼び出すまでに、オブジェクトはすでに自動解放プールによって解放されています。 – Tatsh

答えて

2

ルールは(たとえば、慣例)あります - nonautoreleasedオブジェクトは、...メソッドのallocで&のinitを返された新しい、保持、コピーされています。すべての残りのメソッドはオートレリースされたオブジェクトを返さなければなりません。あなたのケースでは

私は上記のコードを書き換えたい:

.... 
    return [controller autorelease]; 
} 

+ (void)remove:(PZActivityOverlayController *)display { 
    [display viewWillDisappear:YES]; 
    [display.view removeFromSuperview]; 
} 

...

PZActivityOverlayController *view = [[PZActivityOverlayController displayOverView:self.view] retain]; 
// Later on, when complete 
[PZActivityOverlayController remove:view]; 

[view release]; 
+0

私はアナライザーを満足させました。問題は見つかりませんでした(機能はすべて正常に動作しています)。 – Tatsh

+0

@Tatsh、よろしいですか;) – kovpas

関連する問題