我已经在我的显示器上敲了几个小时(并阅读了类似的帖子)。我还是难过。
我在* .h文件中声明了一个数组,它将在表视图中显示数据:
@interface TeamsTableViewController : UITableViewController <UITableViewDelegate, UITableViewDataSource>
{
NSMutableArray *teamsArray;
}
我在-viewDidLoad
中分配数组并在dealloc中释放它:
-(void)viewDidLoad
{
[super viewDidLoad];
// Inititalize the mutablearray that will store the xml for the table.
teamsArray = [[NSMutableArray alloc] init];
}
-(void)dealloc
{
[teamsArray release];
[super dealloc];
}
每次-viewWillAppear
,我都会调用loadData重新加载数据(因为数据可能会发生变化)。对于这篇文章(当我试图找到我的泄漏)时,我已经对数据进行了硬编码。评论显示报告泄漏的位置。 (重新显示表视图时发生泄漏。)
-(void)loadData
{
// Empty any objects that are already in the array.
[teamsArray removeAllObjects];
// Fill a dictionary (normally looping through a file, but hardcoded for leak hunting).
NSMutableDictionary *oneTeamDictionary = [NSMutableDictionary dictionary];
[oneTeamDictionary setObject:@"100" forKey:@"basenumber"];
[oneTeamDictionary setObject:@"Team Name" forKey:@"teamname"];
[oneTeamDictionary setObject:@"XYZ" forKey:@"teamabbr"];
[oneTeamDictionary setObject:@"USA" forKey:@"countryabbr"];
[oneTeamDictionary setObject:@"Joe" forKey:@"manager"];
// Add this team to the array used to display table data.
[teamsArray addObject:[oneTeamDictionary copy]]; // Leaks Malloc 32 bytes and _NSCFDictionary 48 bytes here.
// Reload the table view with new data.
[self.tableView reloadData];
}
在我的新手状态下,我认为[teamsArray release]
会释放字典对象。我也尝试使用“alloc] init]”来创建字典,以及释放和重新分配teamsArray(而不是调用removeAllObjects
)。
答案 0 :(得分:2)
问题是复制功能。来自文档的说明:
特别注意事项
如果您使用的是托管内存(不是垃圾回收),则此方法会在返回之前保留新对象。但是,该方法的调用者负责释放返回的对象。
你为什么不打电话:
[teamsArray addObject:oneTeamDictionary];
答案 1 :(得分:0)
是的乔纳,你是对的。如果要复制该对象,则需要再次释放该对象。 在保留,分配,mutableCopy,复制等...我们是对象。所以我们必须释放它们。