我正在发布NSArray和NSMutableArray,但它显示内存泄漏。而ZoneData代码就像这样
-(ZoneData*) initWithZoneName:(NSString *)zoneNameIn SdName:(NSString *)sdNameIn eCount:(NSString *)eCountIn iCount:(NSString *)iCountIn StandLat:(NSString *)standLatIn StandLong:(NSString *)standLongIn
{
self = [super init];
if (self)
{
zoneName = [zoneNameIn copy];
lsdName = [sdNameIn copy];
leCount = [eCountIn intValue];
liCount = [iCountIn intValue];
standLat = [standLatIn copy];
standLong = [standLongIn copy];
}
return self;
}
如何解决这个问题?
答案 0 :(得分:2)
问题是你的实例变量。在-init
中,您正确地将它们分配给数组中的字符串副本。但是,您还需要在-dealloc
。
-(void) dealloc
{
[zoneName release];
[lsdName release];
[standLat release];
[standLong release];
[super dealloc];
}
现在,您可能会问为什么泄漏工具会告诉您泄漏是在哪里创建带有字符串的NSArray
而不是init方法。原因是不可变对象的-copy
被优化为除了将保留发送到self
之外什么都不做。因此,您拥有的实例变量实际上与-componentsSeparatedByString:
答案 1 :(得分:2)
componentsSeparatedByString:
会返回自动释放的NSArray
。你不应该自己释放,但最接近的NSAutoreleasePool
会为你做到这一点。在第61行,你是在释放数组。
如果您在执行循环时关注内存使用情况,可以在循环的每次迭代中清除自动释放的对象:
for (...)
{
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
// your loop contents.
[pool drain];
}