我找不到这个内存泄漏。我以为我一直在正确地释放东西。这是有问题的代码块。
- (void) createProvince:(NSString *) provinceName {
// if province does not exist create it
if ([self hasProvince: provinceName] == NO) {
// get the province object
NSPredicate *predicate;
predicate = [NSPredicate predicateWithFormat:@"Name == %@", provinceName];
NSMutableArray *provArray = [[NSMutableArray alloc] init];
[provArray setArray: [CoreDataHelper searchObjectsInContext:@"Province" :predicate :@"Name" :YES :[self managedObjectContext]]];
NSIndexPath *indexPath;
indexPath = [NSIndexPath indexPathForRow:0 inSection: 0];
[[self provinces] addObject: [provArray objectAtIndex: [indexPath row]]];
[provArray release];
// create a cities array to hold its selected cities
NSMutableArray *array = [[NSMutableArray alloc] init];
[[self cities] addObject: array];
[array release];
}
}
漏洞在这里:
[[self provinces] addObject: [provArray objectAtIndex: [indexPath row]]];
NSMutableArray *array = [[NSMutableArray alloc] init];
[[self cities] addObject: array];
我正在创建局部变量,通过适当的setter将它们分配给我的实例变量,然后释放局部变量。我不确定发生了什么。
答案 0 :(得分:2)
你有dealloc
方法正确释放所有内容吗?
请注意,泄漏会显示您分配内容的位置。它没有告诉你它实际泄漏的地方;保留没有明确平衡。
答案 1 :(得分:2)
让我们来看看:
NSMutableArray *array = [[NSMutableArray alloc] init];
[[self cities] addObject: array];
[array release];
当你alloc
一个对象时,它的保留计数设置为1:
NSMutableArray *array = [[NSMutableArray alloc] init]; # retain count of array is 1
将对象添加到NSMutableArray
时,该对象的retain
计数会递增:
[[self cities] addObject: array]; # retain count of array is 2
当您release
array
时,其保留计数会递减:
[array release]; # retain count is now 1
一旦你的方法结束,你仍然拥有可变数组[self cities]
拥有的那个数组。
因为[self cities]
似乎没有被释放或清空,所以这就是泄漏的地方。
您需要在某个时刻清空或释放可变数组,释放其中包含的对象。如果cities
是一个类属性,那么在释放类时可能会release
。
修改强>
修正了init
- alloc
错误。