При работе с объектами 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;
}