что значит объявить переменную NSNumber как копию свойства - PullRequest
0 голосов
/ 07 декабря 2011

Я все еще учусь ..., поэтому для следующего свойства

@property (copy) NSNumber *foo;

Что на самом деле делает копия?сделать копию (значение) foo и поместить ее на новое место?Так же, как конструктор копирования?

А также, чтобы уточнить, следующее в основном делает AddRef, верно?

@property (retain) NSNumber *foo;

Ответы [ 2 ]

1 голос
/ 07 декабря 2011

См. Описание свойств здесь: http://cocoacast.com/?q=node/103

copy означает, что присвоение значения свойству сделает копию входного значения.

retain означает, чтовы не получите реальную копию;вы получите тот же объект с дополнительным удержанием на нем.Поэтому, если он был изменен в другом месте, вы увидите изменения в обоих местах.

Для NSNumber s они неизменны, поэтому функции копирования и сохранения функционально эквивалентны.

0 голосов
/ 07 декабря 2011

Что на самом деле делает копия?

В общем случае NSNumber является неизменным - я ожидаю, что copy в этих случаях будет реализовано с использованием retain:

- (id)copyWithZone:(NSZone*)zone {
  return [self retain];
}

А также, чтобы уточнить, следующее в основном делает AddRef, верно?

Хорошо, синтезируя это добавит шаблон подсчета ссылок - фактическая операцияявляется более сложным и принимает обобщенную форму:

- (void)setFoo:(NSNumber *)arg {
  NSNumber * prev = foo;
  foo = [arg retain]; // << or foo = [arg copy]; if you have specified 'copy'
  [prev release];
}
...