私は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つの異なる変数で全く同じテクニックを使用していますが、最初のものではリークは報告されていないので、混乱します。
私はここで何かが分かりにくいと感じます。何か案は?
具体的にはどのようなものですか?一般的には、特定の行に割り当てられたオブジェクト*がリークしただけで、その行がリークの原因ではないことを伝えることができます。コード内の何か他のものが配列を過大に保持したり解放したりするとリークする可能性がありますが、表示したコードは責任を負いません。また、本当にプロパティに変更可能な型を持たせるべきではありません。これによりカプセル化の違反が許され、外部コードはその背後にあるオブジェクトの状態を変更することができます。 –