2012-01-04 8 views
0

ナビゲーションコントローラの現在のビューを閉じて別のビューに置き換えるメソッドがあります。コードはこの現在のビューをポップするときにNSStringを別のビューに渡して保持する

-(void)didTransferRequest:(NSString *)_transferComments { 

    AddRequestViewController *ar = [[AddRequestViewController alloc] 
      initAsTransferForRequestID:requestID 
      withClosingComments: _transferComments]]; 

    UINavigationController *currentNav = self.navigationController; 

    [[self retain] autorelease]; 

    [currentNav popViewControllerAnimated:NO]; 
    [currentNav pushViewController:ar animated:NO]; 

    [ar release]; 

} 

[AddRequestViewController.m] 

-(AddRequestViewController *)initAsTransferForRequestID:(int)requestID 
          withClosingComments:(NSString *)closingComments{ 
    self = [self initWithStyle: UITableViewStyleGrouped]; 

    if (self) { 
     _requestID = requestID; 
     _closingComments = closingComments; 
    } 

    return self; 
} 

のように見える問題は、新しいビューがナビゲーションスタックにプッシュされると、ビューは_transferCommentsによって渡されたコンテンツにアクセスしようとしたとき、それがクラッシュするということです。ポインタは、ビューがポップされてから意味をなさせる他のものを指しています。

withTransferComments:[_transferComments copy]の使用に成功しましたが、このアナライザではメモリリークが確認されました。

コピーセーフを使用していますが、リークメッセージを無視するか、文字列を送信する方が良いでしょうか?

答えて

0

AddRequestViewControllerは、_transferCommentsの所有権を取得していません。

Cocoa Core Competencies - Memory ManagementBasic Memory Management Rulesを読む必要があります。

投稿したコードスニペットでは、私はAddRequestViewControllerretain_transferCommentsに送信しないと推測します。 _transferCommentsを確実に保持したい場合は、文字列の所有権を取得するためにretainメッセージを送信する必要があります。文字列でAddRequestViewControllerを実行すると、所有権を放棄するにはreleaseを送信する必要があります。これはおそらく-[AddRequestViewController dealloc]で行います。

基本的には、あなたのinitAsTransferForRequestID:withClosingComments:方法は次のようになります。

- (id)initAsTransferForRequestID:(int)requestId withClosingComments:(NSString *)transferComments { 
    if (!(self = [super init])) 
     return nil; 

    _requestId = requestId; 
    _transferComments = [transferComments retain]; 

    return self; 
} 

(私は先頭にアンダースコアでインスタンス変数の命名の一般的な規則を使用していますので注意してください。)あなたのdeallocメソッドは次のようになります。

- (void)dealloc { 
    [_transferComments release]; 
    [super dealloc]; 
} 

_transferRequestにコードを変更したときに、メモリリークが発生しました。 copyメッセージは、そのコピーに対する「所有」参照を作成し、その所有権を放棄するために何らかの責任を負う必要があります。あなたはどちらかのオブジェクトを変更していませんでした。

+0

ああ、優秀です。詳細な応答をありがとう、ロブ。私はそれらの記事もチェックアウトします。 – jfuhr

+1

@jfuhr、あなたの問題を解決した場合は、回答を受け入れてください。 – chatur

関連する問題