2011-11-10 9 views
2

アナライザのリークが発生していますが、これは他の場所で問題なく使用しています。私はallocを使用していることを知っているので、解放する必要がありますが、私はdeallocでこれをやっています。Obj-C、行に割り当てられたオブジェクトの潜在的なリーク、UIBarButtonItem alloc

私は間違っていますか?

ヘッダファイル:

@interface myViewController : UIViewController <UITableViewDataSource, 
       UITableViewDelegate> { 

    UIBarButtonItem *addButton; 
} 
@property (nonatomic, retain) UIBarButtonItem *addButton; 

主なファイルは:あなたがセッターを使用していない

@synthesize addButton; 
- (void)viewDidLoad { 

    NSMutableArray* buttons = [[NSMutableArray alloc] initWithCapacity:3]; 


    addButton = [[UIBarButtonItem alloc] 
          initWithBarButtonSystemItem:UIBarButtonSystemItemAdd 
          target:self action:@selector(btnNavAddPressed:)]; 
    addButton.style = UIBarButtonItemStyleBordered; 
    [buttons addObject:addButton]; 

    [tools setItems:buttons animated:NO]; 
    [buttons release]; 

    self.navigationItem.rightBarButtonItem = [[UIBarButtonItem alloc] 
           initWithCustomView:tools]; 

    addButton.enabled = FALSE; 

- (void)dealloc { 
    [addButton release]; 

答えて

1

上記の両方の回答は誤解を招くものです。セッターを使用する必要はありませんが、iVarsに直接オブジェクトを割り当てることは可能です。しかし、あなたが割り当てたり保持しているものはすべて解放する必要があります。あなたが持っている問題はここにある:

self.navigationItem.rightBarButtonItem = [[UIBarButtonItem alloc] initWithCustomView:tools]; 

この行はUIBarButtonItemインスタンスをalloc'ingとnavigationItemrightBarButtonItemプロパティに設定されます。つまり、navigationItemにはUIBarButtonItemが保持されており、その保持には責任があります。あなたはallocのb/cをリリースする責任がありますが、あなたはそうではありません。コードを次のように変更してください。

self.navigationItem.rightBarButtonItem = [[[UIBarButtonItem alloc] initWithCustomView:tools] autorelease]; 

この漏れはなくなります。

+1

これらのタイプの問題は、iOS開発者にとって最も一般的なハードルの1つです。あなたが経験を積むにつれて、より自然になりやすくなります。 xcode 4.2を使用している場合は、ARC(Automatic Reference Counting)のドキュメントを読んでプロジェクトをそのプロジェクトに移行することをお勧めします。 WRTのメモリ管理のルールは変更されませんが、コンパイラがほぼすべての作業を行うことができます。 – XJones

2

、コードは次のようになります。

self.addButton = [[[UIBarButtonItem alloc] 
         initWithBarButtonSystemItem:UIBarButtonSystemItemAdd 
         target:self action:@selector(btnNavAddPressed:)] autorelease]; 

このタイプの問題を回避することができますプロパティー名とは異なる名前のivarを使用します。これは@synthesize文で実現されます。

@synthesize addButton = _addButton; 

selfの欠落は、エラーメッセージが表示されますこの方法です。ここで

は(toolsが未定義を除く)完全な実装で、プロパティaddButtonは、すべての場所でのハンドルです:

@interface myViewController : UIViewController <UITableViewDataSource, UITableViewDelegate> { 
} 
@property (nonatomic, retain) UIBarButtonItem *addButton; 
@end 

@implementation myViewController 
@synthesize addButton = _addButton; 

- (void)viewDidLoad { 
    NSMutableArray* buttons = [NSMutableArray array]; 

    self.addButton = [[UIBarButtonItem alloc] 
       initWithBarButtonSystemItem:UIBarButtonSystemItemAdd 
       target:self action:@selector(btnNavAddPressed:)]; 
    self.addButton.style = UIBarButtonItemStyleBordered; 
    [buttons addObject:self.addButton]; 

    [tools setItems:buttons animated:NO]; 

    self.navigationItem.rightBarButtonItem = [[[UIBarButtonItem alloc] initWithCustomView:tools] autorelease]; 

    self.addButton.enabled = FALSE; 
} 
- (void)dealloc { 
    [_addButton release]; 
} 
@end 
+0

メモリリークはありませんか? (これらのコメントはARC以来ずっと難しくなってきました!) – jrturton

+0

@jrturtonありがとう!もちろんARCの下では、自動解放は必要ありません。 – zaph

+0

それは私が言ったことですが、これは漏れを見つけ出すのが本当に簡単でした。今は余分な層があります。私は古き良き時代を好む... – jrturton

2

あなたがプロパティを使用して、それをあなたがretainCountがインクリメントされているかどうか、指定した属性を割り当てますあなたがプロパティに割り当てる場合。あなたのケースでは、 "retain"を指定しました。これは、プロパティへの代入を処理するセッター関数が自動的にオブジェクトの保持カウントをインクリメントすることを意味します。

あなたは

addButton = [[UIBarButtonItem alloc] 
          initWithBarButtonSystemItem:UIBarButtonSystemItemAdd 
          target:self action:@selector(btnNavAddPressed:)]; 

を書くときしかし、あなたはそれがこれを行うための適切な方法は、一時変数を作成することです、カウント2を保持しているだろう割り当てるとき、既にそのカウント== 1を保持してopjectを作成していますオブジェクトを作成した後、temp変数をプロパティに代入してからtempを解放します。変数:

UIBarButtonItem* tmp = [[UIBarButtonItem alloc] 
          initWithBarButtonSystemItem:UIBarButtonSystemItemAdd 
          target:self action:@selector(btnNavAddPressed:)]; 
self.addButton = tmp; 
[tmp release]; 

もちろん、変数名として「temp」よりもわかりやすい名前を使用することをおすすめします。

+0

これは誤解を招くようなアドバイスです。 OPのコードwrt 'addButton'はそのままです。彼は正しくallocaされたオブジェクトをiVarに直接格納し、それを 'dealloc'で解放しています。 – XJones

0

あなたは宣言されたプロパティを利用していませんが、私はaddButtonに問題はありません。漏れは思わにより:

self.navigationItem.rightBarButtonItem = 
          [[UIBarButtonItem alloc] initWithCustomView:tools]; 

ちょうどautoreleaseを追加し、漏れが消えます。

+0

私はあなたのコードを複製しました。私とアナライザーが見つけた唯一の問題は、自動解放です。きれいにして分析する?または、アナライザーのスクリーンショット(矢印付きのもの)を投稿できますか? – djromero

関連する問題