是一系列[array addObject:[[NSNumber alloc] initWithBool:someVariable]?]创建的内存泄漏;

时间:2010-11-18 17:16:49

标签: objective-c memory-leaks nsnumber alloc

我是否通过以下方式创建多个内存泄漏:

NSMutableArray *array=[[NSMutableArray alloc] init];
[array addObject:[[NSNumber alloc] initWithBool:boolVariable1]];
[array addObject:[[NSNumber alloc] initWithBool:boolVariable2]];
[array addObject:[[NSNumber alloc] initWithInt:intVariable]];
[array addObject:[[NSNumber alloc] initWithFloat:floatVariable]];
[array writeToFile:[self dataFilePath] atomically:YES];
[array release];

使用是否更好:

[array addObject:[NSNumber numberWithInt:intVariable]];

2 个答案:

答案 0 :(得分:5)

rule很简单:每次拨打alloc / new / copy* / retain时,都必须通过调用{{}来平衡它1}} / auto-,否则你会发生内存泄漏。在代码示例中,您将release发送到alloc四次,但没有相应的版本,因此四个NSNumber将泄漏。

NSNumber不是numberWithInt:newalloc,并且不以retain开头,所以不需要与致电copy / auto-

您可以使用一些不同的工具find memory leaks,例如Instruments

答案 1 :(得分:2)

致电

[NSNumber numberWithInt:intVariable]

在概念上等同于

[[[NSNumber alloc] initWithInt:intVariable] autorelease]

所以是的,在您给出的示例中,使用-numberWithInt:会更简单。

NSMutableArray *array=[[NSMutableArray alloc] init];
[array addObject:[NSNumber numberWithBool:boolVariable1]];
[array addObject:[NSNumber numberWithWithBool:boolVariable2]];
[array addObject:[NSNumber numberWithInt:intVariable]];
[array addObject:[NSNumber numberWithFloat:floatVariable]];
[array writeToFile:[self dataFilePath] atomically:YES];
[array release];

否则,您需要在传递给数组的每个参数上添加对-autorelease的调用。