Атрибут @property для NSNumber? - PullRequest
1 голос
/ 13 ноября 2009

В следующем я прав (имея в виду, что NSNumber - это объект) использовать присвоение с NSNumber?

@property(assign) NSNumber *mass;

Также, если бы я использовал retain, мне нужно было бы добавить релиз, но если бы я создал NSNumber с помощью alloc, мне не нужно было бы выпускать дважды, один раз для retain и один раз для alloc?

@property(retain) NSNumber *mass;
mass = [[NSNumber alloc] numberWithInt:5];

1007 * Гэри *

Ответы [ 4 ]

5 голосов
/ 13 ноября 2009

Обычно вы хотите retain переменные вашего экземпляра, чтобы они не исчезали неожиданно для вас. Ваша линия:

mass = [[NSNumber alloc] numberWithInt:5];

немного странно. Вы, вероятно, хотите один из них:

mass = [NSNumber numberWithInt:5];
mass = [[NSNumber alloc] initWithInt:5];

Первый возвращает вам автоматически освобожденный объект NSNumber, второй - NSNumber, который был сохранен. Я ожидаю, что вы действительно ищете это:

@property(retain) NSNumber *mass;
self.mass = [NSNumber numberWithInt:5];
2 голосов
/ 13 ноября 2009

Ваша путаница проистекает из двух отдельных понятий: свойства Objective-C 2.0 и управление памятью.

Использование функции назначения или сохранения полностью зависит от того, что вы пытаетесь сделать, и от того, используете ли вы сборщик мусора. Например, если вы не используете сборщик мусора и используете assign, то установите для массы значение [NSNumber numberWithInt:0], ваш (автоматически выпущенный) экземпляр NSNumber исчезнет, ​​и у вас будут проблемы в следующий раз, когда вы попытаетесь его использовать. .

Что касается того, сколько выпусков вам нужно во втором блоке кода, вам действительно необходимо (пере) прочитать документацию по управлению памятью. Если вы создали объект (с помощью методов, упомянутых в документации), вы несете ответственность за его освобождение. Вот и все. Сохраняет ли это что-то еще или нет - это не ваше дело. Итак, следуя этой логике, если ваше массовое свойство сохраняет (и правильно высвобождает) свое значение (и оно будет, если вы будете использовать @synthesize или следовать надлежащим примерам установки средства доступа), оно прекрасно справляется со своей собственной задачей. Опять же, если вы создаете объект, вы несете ответственность за его освобождение. Другие могут удерживать / освобождать объект по мере необходимости, но это вас не беспокоит.

Кроме того, [[NSNumber alloc] numberWithInt:5] не так. Вы выделяете / инициализируете ... но не выделяете, а затем вызываете вспомогательный метод (который, вероятно, будет выделять / инициализировать ... сам экземпляр).

0 голосов
/ 13 ноября 2009

NSNumber и другие неизменные объекты должны быть @property(retain) NSNumber *mass; (изменяемые объекты должны использовать copy)

при назначении использовать self.mass = [NSNumber numberWithInt:5];. Так как метод не содержит new, copy, init, он возвращает автоматически выпущенный объект. Использование self. вызовет установщик и сохранит значение.

Прочитайте Правила управления памятью .

0 голосов
/ 13 ноября 2009

Вы можете использовать assign, однако вам нужно быть осторожным, чтобы какой-то другой класс нуждался в его сохранении и чтобы класс, который передал его, должен был установить его в ноль при освобождении объекта NSNumber.

Если вы сделаете его сохраняемым свойством, и вы можете написать следующее, что позволит этому свойству иметь retainCount 1:

self.mass = [NSNumber numberWithInt:5];

или

mass = [[NSNumber alloc] initWithInt:5]; 
// no "self." also note that the message is "init..."

или

NSNumber *num = [[NSNumber alloc] initWithInt:5];
self.mass = num;
[num release];

Установка свойства retain увеличивает значение retainCount, только если оно установлено через «instance». или "я".

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