2011-01-05 13 views
0

私はログインビューを実装しています。このビューは、いつでも私のアプリケーションに表示する必要があります。静的アナライザはshowLogin上の潜在的な漏れがあることを私に語っているObjC:自分自身を解放するクラスを適切に実装する方法は?

@implementation LoginController 

@synthesize releaseOnClose; 

+ (void)showLogin { 
    LoginController *login = [[LoginController alloc] init]; 
    login.releaseOnClose = YES; 
    [login show]; // Potential leak of login object 
} 

- (id)init { 
    if (self = [super initWithNibName:@"Login" bundle:[NSBundle mainBundle]]) { 
      releaseOnClose = NO; 
    } 
    return self; 
} 



- (void)show { 
    if (self.view.superview == nil) { 
      // show the view 
    } 
} 



- (void)btnCloseTouched { 
    [self.view removeFromSuperview]; 
    if (releaseOnClose) { 
      [self release]; 
    } 
} 

、しかし:だから、それは簡単に私がshowLoginというクラスメソッドを作成し、ビューは私はそれが自分自身を解放したい閉じたときに、私はこれをしなかっ作ります実際には、私はbtnCloseTouchedでオブジェクトをリリースしていないので(これは単に開いたり閉じたりするために、ログインビューの他の機能については心配しないでください)。

私はどのようにこの潜在的なリークメッセージを避けるためにどのようにこの種の適切なメモリを正しく処理するクラスのメソッドを実装する方法を知りたいですか?

アイデア

私が考えたものについてもう少し。私はshowLoginを呼びたいと思っていました。呼び出し元がインスタンスを管理する必要なく、閉じられるまで存在します。

答えて

2

あなたが解放されていないメモリを割り当てているので、それがリーク文句だ理由がある - 例えば:

LoginController *login = [[LoginController alloc] init]; 

そして、あなたはこれをやっている方法は、下位のすべてのようだ - なぜあなたは本当にわかりませんLoginControllerの新しいオブジェクトをインスタンス化してから、新しいオブジェクトを解放しようとすると自分自身を解放しますか?それを行うもっと良い方法がなければなりません。

割り当てたインスタンスを解放する必要があります。自己は、割り当てた新しいインスタンスのインスタンス(ログイン)ではありません。

あなたがそれで終わったら次の操作を行いますすることができますあなたのクラスメソッドで、その後

@implementation LoginController 

@synthesize releaseOnClose; 

LoginController *mySingleLoginController; 

:あなたの@implementationブロックで

[login release]; 
+0

私は2番目の部分を取得しません。 btmCloseTouchedのselfは正しいインスタンスです。しかし、他の部分について同意する。 – Eiko

+0

自己!= LoginController * login = [[LoginController alloc] init];しかし、。 'login'を含むオブジェクトの正しいインスタンスかもしれませんが、同じインスタンスではありません。とにかく、コードは本当に混乱している - それは欠陥がある。 – xil3

+0

@ xil3クラスメソッドがインスタンスに表示するように指示してから、インスタンスがクローズ(および解放)するアクションを受け取るように見えます。それは間違いなく間違いですが、実行可能なようです。 – Richard

0

ログインウィンドウの新しいクラス(LoginView)を作成して、そのクラス自体がdeallocでクリーンアップされないようにしてください。その後、必要に応じてそのクラスの新しいインスタンスを作成することができます。削除すると、メモリリークが発生しません。

+0

私はあなたの提案を得るかどうかはわかりませんが、これは問題ではないと思います。すべてのdeallocは正常です。アナライザーは、規約ではすべてのallocがリリースを必要とし、release(btnCloseTouchedにあります)を見つけることができないため、潜在的なリークがあるとアナライザーが示しています。私はこの種のクラスを正しく実装するかどうかはわかりません。 –

+0

私は、ログインウィンドウ用に別のクラスを作成し、それを表示する必要があるときにインスタンスを作成し、それをビューに追加してから解放することを意味しました。ビューから削除すると、メモリは 'dealloc'の世話をします。これはもっと普通の方法です。 –

1

をあなたは、このようなLoginControllerクラスを宣言することができますdo:

+ (void)showLogin { 
    mySingleLoginController = [[LoginController alloc] init]; 
... 

しかし、私はこのアプローチをお勧めしません...

Moszi

0

はなぜそれを通常の方法を行うと、クラス解放、それを初期化し、インスタンスを聞かせ、または自動解放プールに入れませんか?

何らかのアクションが発生したときにクラスを削除して解放するというメリットはありません。このようにしてあなたの動機は何ですか?

+0

私は事を簡素化することを考えていましたが、他の人が間違いやすいと言ったので私は気が変わっています。 –

関連する問題