如何在ARC中覆盖setter时管理对象?

时间:2014-09-09 02:57:35

标签: ios objective-c

当我覆盖@property的setter时,我有疑问。

即:

如果我设置这样的属性:

@property(strong)NSString * name;

在'MRC'中它将自动生成getter和setter,假设setter将实现如下:

- (void)setName:(NSString *)name
{
    [_name release]; // Release previous.
    _name = name;
    [_name retain];  // Remain object.
}

当我在'MRC'中覆盖setter时,我可以按照上面代码中的'强'行为来管理对象,

但是在'ARC'中,什么将设置器实现像或如何管理对象使其行为像'强',因为它在'ARC'中没有'保留和释放'?

谢谢你的时间!

2 个答案:

答案 0 :(得分:1)

在ARC下,编译器生成此setter:

- (void)setName:(NSString *)name {
    _name = name;
}

但是,由于_name被声明为__strong(因为该属性为strong),因此该分配将变为对objc_storeStrong的调用:

- (void)setName:(NSString *)name {
    objc_storeStrong(&_name, name);
}

objc_storeStrong函数负责保留和释放,并且比你的更安全:

id objc_storeStrong(id *object, id value) {
  value = [value retain];
  id oldValue = *object;
  *object = value;
  [oldValue release];
  return value;
}

(如果name == _name并且在设置者的开头它的保留计数为1,请考虑你的setter中会发生什么。objc_storeStrong函数也是为了避免竞争而仔细编写的多个线程尝试同时设置属性时的条件。)

答案 1 :(得分:0)

除了明确桥接到Core Foundation指针(编译器可以自动修复)之外,ARC并不需要您执行任何特殊或额外的操作。它主要要求您自己编写内存管理代码(如保留/释放调用)。你真的不需要“学习ARC”,你只需要了解ARC无法为你处理的内存问题,比如保留周期(坏)和C指针的管理(即Core Foundation类型 - 除非调用Swift,在这种情况下ARC也可以处理它们。 ARC的全部意义在于自动化软件开发的一部分,这非常繁琐且容易出错;你担心的不是更多,而是更多。作为类比,你不需要知道任何关于SQL的知识就可以使用Core Data ...更精细的细节会被抽象出来。

由于声明它强大,你使该物业变得强大,你在设置器中没有任何特殊的东西:

-(void)setName:(NSString*)name
{
    _name = name;
}

当然,这是一个愚蠢的例子,因为无论如何,当你所做的一切都是默认行为时,没有理由覆盖一个setter。但是你明白了......