2009-03-13 11 views
1

私はiPhoneアプリを書いています。私はこのようになりますヘッダファイルがあります:実装ファイルでObjective-Cのこのラインでメモリが漏れているのはなぜですか?


@interface EditTagsViewController : UITableViewController { 
    NSMutableArray *allTags; 
    NSMutableArray *selectedTags; 
    NSInteger currentFavorite; 
} 
@property (nonatomic, retain) NSMutableArray *allTags; 
@property (nonatomic, retain) NSMutableArray *selectedTags; 
@property (nonatomic) NSInteger currentFavorite; 
@end 

を、私のviewDidLoadメソッドは次のようになります。ここでは


- (void)viewDidLoad { 
    NSMutableArray *aTags = [[NSMutableArray alloc] initWithArray:[Tag findAllTags]]; 
    self.allTags = aTags; 
    [aTags release]; 

    NSMutableArray *sTags = [[NSMutableArray alloc] initWithArray:[Tag findByFavoriteId:currentFavorite]]; 
    self.selectedTags = sTags; 
    [sTags release]; 

    UIBarButtonItem *add = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemAdd target:self action:@selector(addNewTag:)]; 
    self.navigationItem.rightBarButtonItem = add; 
    [add release]; 
    [super viewDidLoad]; 
} 

は私のdeallocメソッドである:


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

何私に混乱させるのは、シミュレータとデバイス自体の両方で、Instruments(メモリリーク)を使用してアプリケーションを実行すると、viewDidLoadメソッドのこの行が配列をリークしていることがわかります。


self.selectedTags = sTags; 

私は2つの異なる変数で全く同じテクニックを使用していますが、最初のものではリークは報告されていないので、混乱します。

私はここで何かが分かりにくいと感じます。何か案は?

+0

具体的にはどのようなものですか?一般的には、特定の行に割り当てられたオブジェクト*がリークしただけで、その行がリークの原因ではないことを伝えることができます。コード内の何か他のものが配列を過大に保持したり解放したりするとリークする可能性がありますが、表示したコードは責任を負いません。また、本当にプロパティに変更可能な型を持たせるべきではありません。これによりカプセル化の違反が許され、外部コードはその背後にあるオブジェクトの状態を変更することができます。 –

答えて

0

findByFavoriteIdにはretainがありますか?それは私がaTagssTagsの間で見ることができる唯一の違いはあなたの例で使用されています

1

あなたのコードは私に似ています。 [Tag findAllTags]または[Tag findByFavoriteId:]のいずれかが漏れている可能性がありますか? self.allTagsself.selectedTagsnildeallocに設定していますか?

self.allTags = ...allTags = ...の違いに注意してください。 allTagsはプロパティで、retain属性を持っているため、self.allTags = ...を介して割り当てるたびに暗黙的にセッターメソッド[self setAllTags:...]が呼び出され、新しい値にはretain、古い値にはreleaseが(存在する場合)呼び出されます。このコードサンプルで正しく実行していますが、別の場所にallTagsself.は含まれていません)に直接割り当てると、リークの原因となる古い値ではありません。 selectedTagsの場合も同様です。

関連する問題