Свойство Objective-C - разница между сохранением и назначением - PullRequest
3 голосов
/ 07 июня 2010

Я думаю, что что-то упущено в атрибутах свойств. Во-первых, я не могу понять разницу между retain и assign.

Если я использую assign, увеличивает ли свойство счетчик retain на 1 для установщика, а также для получателя, и мне нужно использовать release для них обоих?

А как это работает с readwrite или copy? С точки зрения retain кол.

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

@property (readwrite,assign) int iVar; 

Что assign здесь делает?

В чем разница между:

@property (readwrite,assign) int iVar;

и

@property (readwrite,retain) int iVar;

и

@property (readwrite) int iVar;

Большое спасибо ...

Ответы [ 2 ]

11 голосов
/ 07 июня 2010

В чем разница между: @property (readwrite, assign) int iVar; @property (readwrite, retain) int iVar; @property (readwrite) int iVar;

Сеттер для @property (readwrite,assign) sometype aProperty; семантически эквивалентен

-(void) setAProperty: (sometype) newValue
{
    ivar = newValue;
}

Вышесказанное более или менее то, что вы получите, если вы положите

@asynthesize aProperty = ivar;

в вашей реализации.

Сеттер для @property (readwrite,retain) sometype aProperty; семантически эквивалентен

-(void) setAProperty: (sometype) newValue
{
    [newValue retain];
    [ivar release];
    ivar = newValue;
}

Очевидно, что нет смысла сохранять или освобождать int, поэтому sometype должен быть либо id, либо SomeObjectiveCClass*

Сеттер для @property (readwrite,copy) sometype aProperty; семантически эквивалентен

-(void) setAProperty: (sometype) newValue
{
    sometype aCopy = [newValue copy];
    [ivar release];
    ivar = aCopy;
}

В этом случае не только должен быть sometype классом C, но он должен отвечать на -copyWithZone: (или, эквивалентно, реализовывать NSCopying).

Если вы опускаете сохранение или назначение или копирование, по умолчанию назначается.

Кстати, я упростил вышесказанное, не учитывая блокировку, возникающую из-за того, что свойства также не указывают nonatomic.

4 голосов
/ 07 июня 2010

Существует два вида спецификаторов:

Спецификатор readwrite сообщает, что свойство будет доступно для чтения / записи, поэтому при выполнении @ synthesize оно создаст и метод получения, и метод установки.

Также есть readonly, чтобы указать, что свойство будет иметь только геттер.

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

Модификатор assign сообщает, что ивару будет просто назначено все, что получает установщик. Так, в случае объекта, retain не будет вызван.

При retain всякий раз, когда вы используете синтезированный сеттер, будет вызываться retain, поэтому объект будет сохранен. Это означает, что класс, имеющий установщик, должен release его в какой-то момент (вероятно, в своем методе dealloc).

Что касается copy, это означает, что вместо retain объект получит сообщение copy. Это означает, что в итоге у вас будет копия оригинального объекта с сохраненным счетчиком, равным единице, поэтому вы снова несете ответственность за его освобождение.

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