在目标C中保留和分配

时间:2011-03-03 04:56:17

标签: objective-c

我想知道Objective C中保留和赋值之间的区别

3 个答案:

答案 0 :(得分:6)

使用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的引用。 alpha的简单分配不会以任何方式影响源对象。 alpha只是另一个指向aColor的指针。

beta仍然是另一个指向aColor的指针,但是-retain还具有将保留计数增加1的额外效果。

当您声明要使用retain的属性时,

@property (retain) UIColor *color;

编译器将生成一个set访问器,将参数值分配给ivar并保留source参数。从本质上讲,

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

声明要使用assign的属性时,

@property (assign) UIColor *color;

你获得了ivar赋值而没有对source参数进行任何更改。

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

答案 1 :(得分:3)

这是属性“保留”时自动提供的setter中发生的事情

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

相反,当你有“分配”时会发生什么

- (void)setValue: (id)newValue
{
    if (value != newValue)
    {
        value = newValue;
    }
}

答案 2 :(得分:0)

保留告诉编译器向我们分配给属性的任何对象发送保留消息。这使得实例变量在使用时保持活动状态(而不是释放它)。

Assign旨在用于低级别C数据类型或垃圾回收。 GC也不属于iOS的任何功能。