带有内存泄漏的NSMutableArray

时间:2012-08-22 15:48:35

标签: iphone ios cocoa-touch cocoa ipad

我正在使用以下代码来创建NSMutableArray。当我在“配置文件”模式下运行相同时,它显示内存泄漏。

SampleArray.h

@interface SampleArray: NSObject {
}
@property (assign, retain) NSMutableArray *array;
@end

SampleArray.m

#import "SampleArray.h"
@implementation SampleArray
@synthesize array;
-(void) viewDidLoad {
    self.array =[ [NSMutableArray alloc] init];
}

-(void) viewWillDisappear:(BOOL)animated {
    [self.array release];
}
@end

当我使用autorelease时,我无法在其他函数或方法中访问它并返回null值。请帮我找到问题。

4 个答案:

答案 0 :(得分:1)

在viewWilLDisappear中发布此数组不是一个好主意,您应该在dealloc函数中释放。您应该担心过度释放此项并导致程序崩溃,因为viewWilLDisappear可能会在此ViewController的生命周期内多次调用。

无论如何,你是双重保留项目,因为你的财产有一个保留(并使其非原子,不分配),添加自动释放到您的alloc / init:

self.array =[[[NSMutableArray alloc] init] autorelease]; 

并移动

[array release];

到你的dealloc函数。或转换为ARC,不再担心......

答案 1 :(得分:0)

尝试将其设置为(非原子,保留),然后自动释放。

答案 2 :(得分:0)

首先,我假设您正在使用

@property (nonatomic, retain) NSMutableArray *array;

使用此

-(void) viewDidLoad {
    array =[[NSMutableArray alloc] init];
}

-(void) viewWillDisappear:(BOOL)animated {
    [array release];
}

我建议您使用dealloc而不是viewWillDisappear

-(void) dealloc {
    [array release];
    [super dealloc];
 }

您的代码说明

   -(void) viewDidLoad {
        // here you are allocating a mutable array thus retain count becomes one
        // then you are assigning it to the property which is retain and thus retains it
        // making the retain count 2
        self.array =[ [NSMutableArray alloc] init];
    }

    -(void) viewWillDisappear:(BOOL)animated {
        // here you are releasing it so its retain count becomes 1 from 2
        // thus shows memory leak
        [self.array release];
    }

答案 3 :(得分:0)

最好在-dealloc()中处理内存解除分配,并在-viewDidUnload()

中将数组设置为nil以更安全

所以它将是:

-(void) viewDidUnload 
{
    self.array = nil;
}

-(void) dealloc
{
    [array release];

    [super dealloc];
}

和其他人一样说,将您的财产声明为(非原子,保留)而不是(分配,保留)