Утечка памяти создается серией [array addObject: [[NSNumber alloc] initWithBool: someVariable]?]; - PullRequest
0 голосов
/ 18 ноября 2010

Могу ли я создать несколько утечек памяти:

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 ]

5 голосов
/ 18 ноября 2010

Правило простое: каждый раз, когда вы звоните alloc / new / copy* / retain, вы должны сбалансировать его с вызовом на auto- / release,иначе у вас утечка памяти.В примере кода вы отправляете alloc на NSNumber четыре раза, но не имеете соответствующих выпусков, поэтому четыре NSNumber s будут просачиваться.

numberWithInt: не new, alloc, retain и не начинается с copy, поэтому его не нужно балансировать с помощью вызова auto- / release.

. Есть также несколько различных инструментов.Вы можете использовать, чтобы найти утечки памяти , например Instruments .

2 голосов
/ 18 ноября 2010

Звонок на

[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 для каждого аргумента, передаваемого в массив.

...