Создана ли утечка памяти последовательностью [array addObject:[[NSNumber alloc] initWithBool:someVariable]?];

Создаю ли я множественные утечки памяти:

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]];

person Peter Kramer    schedule 18.11.2010    source источник
comment
Если лучше значит не неправильно, то да :-)   -  person David Gelhar    schedule 18.11.2010


Ответы (2)


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

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

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

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

person jlehr    schedule 18.11.2010