在目标C中保留和分配

sum*_*man 5 objective-c

我想知道Objective C中retain和assign之间的区别

Bil*_*son 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
}
Run Code Online (Sandbox Code Playgroud)

alpha和beta都是对象aColor的引用.alpha的简单分配不会以任何方式影响源对象.alpha只是另一个指向aColor的指针.

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

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

@property (retain) UIColor *color;
Run Code Online (Sandbox Code Playgroud)

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

-(void)setColor:(UIColor *)aColor
 {
   ...
   color = [aColor retain];
 }
Run Code Online (Sandbox Code Playgroud)

声明属性以使用assign时,

@property (assign) UIColor *color;
Run Code Online (Sandbox Code Playgroud)

你得到了ivar赋值,而没有对source参数进行任何修改.

-(void)setColor:(UIColor *)aColor
 {
   ...
   color = aColor;
 }
Run Code Online (Sandbox Code Playgroud)


loc*_*boy 0

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

分配旨在与低级 C 数据类型或垃圾收集一起使用。GC 也不属于 iOS 的任何功能。