Сохранить и назначить в задаче C - PullRequest
5 голосов
/ 03 марта 2011

Я хочу знать разницу между сохранением и назначением в Задаче C

Ответы [ 3 ]

6 голосов
/ 10 апреля 2011

При работе с объектами Objective-C

assign создает ссылку от одного объекта к другому без увеличения счетчика хранения источника.

retain создает ссылку от одного объекта к другому и увеличивает счетчик сохранения исходного объекта.

aColor - исходный объект.Допустим, в метод входит число сохранений 400.

-(void) changeColor:(UIColor *)aColor
{
   UIColor *alpha = aColor; // aColor retain count = 400 still

   UIColor *beta = [aColor retain]; // aColor retain count now 401
}

alpha и beta являются ссылками на объект aColor.Простое назначение альфа никак не влияет на исходный объект.альфа это просто еще один указатель на aColor.

beta - это еще один указатель на aColor, но -retain имеет дополнительный эффект увеличения количества сохраняемых данных на 1.

Когда вы объявляете свойство для использования retain,

@property (retain) UIColor *color;

компилятор сгенерирует метод доступа set, который назначает значение аргумента для ivar, а также сохраняет исходный аргумент.По сути,

-(void)setColor:(UIColor *)aColor
 {
   ...
   color = [aColor retain];
 }

Когда вы объявляете свойство для использования assign,

@property (assign) UIColor *color;

вы получаете назначение ivar без каких-либо изменений в исходном аргументе.

-(void)setColor:(UIColor *)aColor
 {
   ...
   color = aColor;
 }
3 голосов
/ 13 июня 2012

это то, что происходит в установщике, предоставляемом автоматически, когда свойство «сохраняет»

- (void)setValue: (id)newValue
{
    if (value != newValue)
    {
        [value release];
        value = newValue;
        [value retain];
    }
}

это то, что происходит, когда вы «назначаете»

- (void)setValue: (id)newValue
{
    if (value != newValue)
    {
        value = newValue;
    }
}
0 голосов
/ 10 апреля 2011

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

Назначение предназначено для использования с типами данных низкого уровня C или со сборкой мусора. GC также не работает под iOS.

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