我以为我知道如何处理内存泄漏和数组,但随后会弹出。我无法想象为什么这是泄漏:
// MyViewController.h
NSMutableArray *myMutableArray;
@property (nonatomic, retain) NSMutableArray *myMutableArray;
// MyViewController.m
@synthesize myMutableArray;
- (void) viewDidLoad {
if (self.myMutableArray == nil) {
self.myMutableArray = [[NSMutableArray alloc] init];
}
. . .
for (NSUInteger i = 0; i < someCount; ++i) {
[self.myMutableArray addObject:[NSString stringWithFormat: @"%@",myString]];
}
}
- (void)viewDidUnload {
self.myMutableArray = nil
}
- (void)dealloc {
[myMutableArray release];
}
答案 0 :(得分:4)
你的问题在这里:
if (self.myMutableArray == nil) {
self.myMutableArray = [[NSMutableArray alloc] init];
}
应该是:
if (myMutableArray == nil) {
self.myMutableArray = [[[NSMutableArray alloc] init] autorelease];
}
或者:
if (myMutableArray == nil) {
myMutableArray = [[NSMutableArray alloc] init];
}
说明:
由于您使用retain
作为属性mutator属性,因此在将对象传递给属性设置器时将保留该对象,因此当您retain
已拥有所有权的对象时,您会发生泄漏的。
对此的解决方案是:a)将autorelease
- d对象传递给属性设置器或b)将ivar直接分配给已分配的对象。
答案 1 :(得分:2)
您正在分配一个新数组,然后将其设置为retain属性。将该行更改为
self.myMutableArray = [NSMutableArray array];
答案 2 :(得分:1)
self.myMutableArray = [[NSMutableArray alloc] init];
应该是
self.myMutableArray = [[[NSMutableArray alloc] init] autorelease];
因为myMutableArray是一个保留属性。