iphone:如何解决NSArray内存泄漏?
我正在释放NSArray和NSMutableArray,但它显示内存泄漏。而ZoneData代码是这样的iphone:如何解决NSArray内存泄漏?,iphone,objective-c,memory-management,memory-leaks,nsarray,Iphone,Objective C,Memory Management,Memory Leaks,Nsarray,我正在释放NSArray和NSMutableArray,但它显示内存泄漏。而ZoneData代码是这样的 -(ZoneData*) initWithZoneName:(NSString *)zoneNameIn SdName:(NSString *)sdNameIn eCount:(NSString *)eCountIn iCount:(NSString *)iCountIn StandLat:(NSString *)standLatIn StandLong:(NSString *)standL
-(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;
}
如何解决这个问题?问题在于实例变量。在
-init
中,正确地将它们分配给数组中字符串的副本。但是,您不需要在-dealoc
中释放它们
-(void) dealloc
{
[zoneName release];
[lsdName release];
[standLat release];
[standLong release];
[super dealloc];
}
现在,您可能会问,为什么泄漏工具会告诉您泄漏是在创建
NSArray
的地方,其中包含字符串,而不是init方法。原因是对不可变对象的-copy
进行了优化,除了将retain发送到self
之外,什么都不做。因此,作为实例变量的那些副本实际上是由-componentsSeparatedByString:
创建的相同对象。问题在于您的实例变量。在-init
中,正确地将它们分配给数组中字符串的副本。但是,您不需要在-dealoc
中释放它们
-(void) dealloc
{
[zoneName release];
[lsdName release];
[standLat release];
[standLong release];
[super dealloc];
}
现在,您可能会问,为什么泄漏工具会告诉您泄漏是在创建
NSArray
的地方,其中包含字符串,而不是init方法。原因是对不可变对象的-copy
进行了优化,除了将retain发送到self
之外,什么都不做。因此,作为实例变量的那些副本实际上是由-componentsSeparatedByString:
componentsSeparatedByString:
创建的相同对象。componentsSeparatedByString:返回一个自动删除的NSArray
。你不应该自己发布,但是最近的NSAutoreleasePool
会为你发布。在第61行中,您正在覆盖数组
如果在执行循环时担心内存使用情况,可以在循环的每次迭代中清除自动释放的对象:
for (...)
{
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
// your loop contents.
[pool drain];
}
componentsSeparatedByString:
返回自动删除的NSArray
。你不应该自己发布,但是最近的NSAutoreleasePool
会为你发布。在第61行中,您正在覆盖数组
如果在执行循环时担心内存使用情况,可以在循环的每次迭代中清除自动释放的对象:
for (...)
{
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
// your loop contents.
[pool drain];
}
您应该在ZoneData的dealloc方法中发布zoneName、lsdName、standLat、standLong。为什么要在forloop的每次迭代中分配ZoneData*数据?而你也可以在之前就这么做。你应该在ZoneData的dealoc方法中释放zoneName、lsdName、standLat、standLong。为什么你要在forloop的每次迭代中分配ZoneData*数据?而你也可以在这之前做。