问题描述
|
我以为我知道如何处理内存泄漏和数组,但是随后弹出。我不知道为什么会泄漏:
// 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];
}
解决方法
您的问题在这里:
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];
}
说明:
由于您将“ 4”用作属性更改器属性,因此该对象在传递给属性设置器时将被保留,因此当您“ 4”已拥有所有权的对象时就会泄漏。
解决方案是:a)将set6 Pass-d对象传递给属性设置器,或b)将ivar直接分配给分配的对象。
,您正在分配一个新数组,然后将其设置为keep属性。将该行更改为
self.myMutableArray = [NSMutableArray array];
,self.myMutableArray = [[NSMutableArray alloc] init];
应该
self.myMutableArray = [[[NSMutableArray alloc] init] autorelease];
因为myMutableArray是保留的属性。