我正在写一个iPhone应用程序。我有一个头文件,如下所示:
@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 :(得分:1)
您的代码对我来说是正确的。 [Tag findAllTags]
或[Tag findByFavoriteId:]
中的一个是否可能泄漏?您确定在self.allTags
中将self.selectedTags
和nil
设置为dealloc
吗?
请注意说self.allTags = ...
和allTags = ...
之间的区别。由于allTags
是属性且具有retain
属性,因此无论何时通过self.allTags = ...
分配,它都会隐式调用setter方法[self setAllTags:...]
,该方法会调用retain
新值和release
旧值(如果有)。您在此代码示例中正确地执行了此操作,但如果您在其他地方直接指定allTags
(没有self.
),则表示您不是release
旧值,可能是泄漏的来源。同样适用于selectedTags
。
答案 1 :(得分:0)
看看findByFavoriteId
那里有retain
吗?这是我在示例中使用的aTags
和sTags
之间唯一的区别