当我覆盖@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'中没有'保留和释放'?
谢谢你的时间!
答案 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)
由于声明它强大,你使该物业变得强大,你在设置器中没有任何特殊的东西:
-(void)setName:(NSString*)name
{
_name = name;
}
当然,这是一个愚蠢的例子,因为无论如何,当你所做的一切都是默认行为时,没有理由覆盖一个setter。但是你明白了......