【发布时间】:2009-03-13 04:43:39
【问题描述】:
我正在编写一个 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 个不同的变量,但第一个变量没有报告泄漏。
我觉得我在这里遗漏了一些明显的东西。有什么想法吗?
【问题讨论】:
-
Instruments 具体告诉你什么?它通常只能告诉您在特定行的 allocated 对象已泄漏,但不能告诉您该行是泄漏的原因。如果您的代码中的其他内容过度保留或释放数组,那么它可能会泄漏,但您显示的代码将不负责。此外,您真的不应该使属性具有可变类型。这允许违反封装,外部代码可以改变其背后的对象的状态。
标签: iphone objective-c memory-management