我想知道Objective C中保留和赋值之间的区别
答案 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的任何功能。