0

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

SampleArray.h

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

样品阵列.m

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

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

当我使用自动释放时,我无法在其他函数或方法中访问相同的内容并返回空值。请帮我找出问题所在。

4

4 回答 4

1

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

无论如何,您要双重保留该项目,因为您的属性上有一个保留(并使其成为非原子的,而不是分配的),向您的 alloc/init 添加一个自动释放:

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

并移动

[array release];

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

于 2012-08-22T15:56:03.537 回答
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];
    }
于 2012-08-22T16:03:19.360 回答
0

最好在 -dealloc() 中处理内存取消分配并将数组设置为 nil 以在 -viewDidUnload() 中更安全

所以它将是:

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

-(void) dealloc
{
    [array release];

    [super dealloc];
}

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

于 2012-08-22T16:04:40.190 回答
0

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

于 2012-08-22T15:52:09.393 回答