Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
iphone:如何解决NSArray内存泄漏?_Iphone_Objective C_Memory Management_Memory Leaks_Nsarray - Fatal编程技术网

iphone:如何解决NSArray内存泄漏?

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

我正在释放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;    
}


如何解决这个问题?

问题在于实例变量。在
-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*数据?而你也可以在这之前做。