target-c: когда автоматически высвобождать объект nsnumber, когда не используется alloc - PullRequest
0 голосов
/ 28 марта 2012

Я заметил, что моя программа зависала, потому что ей не хватало памяти.Я понял, что это происходит из-за этого сегмента кода:

DataSet *tempSet = [[DataSet alloc] init];          
tempSet.rightFoot = [NSNumber numberWithDouble:temp1];
tempSet.leftFoot = [NSNumber numberWithDouble:temp2];
[footData addObject:tempSet];   //add dataSet object to the array
[tempSet release];

Я прочитал некоторые учебники об управлении памятью онлайн и смог выяснить, что мне нужно сделать это:)

DataSet *tempSet = [[DataSet alloc] init];          
tempSet.rightFoot = [[NSNumber numberWithDouble:temp1] autorelease];
tempSet.leftFoot = [[NSNumber numberWithDouble:temp2] autorelease];
[footData addObject:tempSet];   //add dataSet object to the array
[tempSet release];

Я все еще не понимаю, почему мне пришлось это сделать.Я не использовал alloc, new или copy при создании numberWithDouble.

Означает ли это, что мне нужно было бы добавить autorelease также и в этой ситуации??:

tempSet.rightFoot = [NSString stringWithString:@"temp"];

Я ценю любую помощь.

Ответы [ 2 ]

1 голос
/ 28 марта 2012
+numberWithDouble

называется удобным методом . Это означает, что он заменяет небольшой фрагмент кода, который будет выглядеть следующим образом:

[[[NSNumber alloc]initWithDouble:double]autorelease];

Большинство (если не все) удобные методы по умолчанию имеют автоматическое освобождение, поэтому код OP с автоматическими выпусками является неправильным, поскольку он уменьшает количество сохраняемых данных до -1.

Однако знак равенства эквивалентен

[self setRightFoot:[[[NSString alloc]initWithString]autorelease]];

, который увеличивает счет сохранения rightFoot и требует его освобождения в другом месте.

Что касается кода -addObject, он возвращает void, так что фактически он не увеличивает счетчик сохранения получателя и не требует освобождения получателя. Объект в массиве уже должен быть освобожден вспомогательным методом для дальнейшего использования, что не имеет значения, поскольку массив теперь содержит его «копию».

0 голосов
/ 24 сентября 2012

Это не ответ (я просто не знаю, как комментировать - я вижу только «поделиться, редактировать, пометить»), но лишь немного информации об управлении памятью в iOS: 1. Не выпускайте объекты, которыевы не являетесь владельцем .. ---> вашими объектами обычно являются те, которые вы «выделяете», «новые», «копируете».// И, возможно, тот, который находится в вашем @property, где вы «сохраняете» объект.2. когда вы «автоматически выпускаете» объект, не «отпускайте» его впоследствии, потому что это будет означать, что вы выпускаете один и тот же объект дважды.

Но уже есть ARC, так что вам лучше обновить свой Xcode доизбегайте чрезмерного высвобождения объектов / утечек памяти (для того, чтобы не освобождать объекты) ..

Если что-то не так или неуместно с тем, что я здесь разместил, пожалуйста, отредактируйте.:)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...