我是 Objective-C 的新手,并且仍然试图了解所有不同的东西(来自 C# 和 C)。我在我的项目中使用 ARC。
假设我有一个这样的构造函数:
-(id)initWithPriority:(NSNumber *)x1 Value:(id)y1
我有两个(强)(综合)属性(x2,y2)。如果我做:
_x2=x1;
_y2=y1;
(跳过通过属性,只访问合成的 ivars),而不是
x2=x1;
y2=y1;
ARC 是否仍然起作用(就像它仍然保持保留计数一样)?
我是 Objective-C 的新手,并且仍然试图了解所有不同的东西(来自 C# 和 C)。我在我的项目中使用 ARC。
假设我有一个这样的构造函数:
-(id)initWithPriority:(NSNumber *)x1 Value:(id)y1
我有两个(强)(综合)属性(x2,y2)。如果我做:
_x2=x1;
_y2=y1;
(跳过通过属性,只访问合成的 ivars),而不是
x2=x1;
y2=y1;
ARC 是否仍然起作用(就像它仍然保持保留计数一样)?
您将直接设置实例变量,而不使用访问器。ARC 将执行引用计数。
注意:您还需要在初始化程序的实现中保留属性的语义。例如,如果它声明copy了 ,那么您将在初始化程序中将参数的副本分配给 ivar。
补充阅读:
ARC按任务操作;否则将是毫无目的的。(如果它只能通过属性进行操作,它不会向 ARC 之前存在的内容添加任何内容。)所以是的,如果您直接分配给 ivar,分配的值会自动保留。
如果它是您的 ivar ,您应该直接分配给ivar ,因为在 期间,您的对象还没有完全准备好状态。因此,在 中,直接对 ivars执行对您的ivars 的任何分配;不要使用访问器/属性。例子:init...init...
- (id) initWithName: (NSString*) s {
self = [super init];
if (self) {
self->_name = [s copy]; //
}
return self; }
但是,您可以分配给您的超类的属性。因此,如果这是一个 UIViewController 子类,分配到self.title就可以了。
有关 ARC 工作原理的完整说明,请参阅我的书:
是的,您可以直接分配实例变量。
如果没有 ARC,您将需要保留该对象:
[_x1 release];
_x1 = [x1 retain];
使用 ARC,您只需分配实例变量:
_x1 = x1;