使用属性自定义或覆盖访问者

时间:2014-03-13 06:02:59

标签: ios objective-c accessor

两个相似的问题

问题1:我有一个名为mySetter的自定义setter :, stockName是否还有强指针?

@property (nonatomic, strong, setter = mySetter:) NSString *stockName;
- (void)mySetter:(NSString *)name {
    _stockName = name;
}

问题2:我覆盖了默认的setter,stockName是否仍然保持强指针?

@property (nonatomic, strong) NSString *stockName;
- (void)setStockName:(NSString *)stockName {
    _stockName = stockName;
}

感谢您的回复

3 个答案:

答案 0 :(得分:0)

来自Encapsulating Data in"使用Objective-C编程":

  

注意:编译器将自动合成实例变量   在所有情况下,它也合成至少一个访问者   方法。如果为读写实现getter和setter   编译器将使用属性或只读属性的getter   假设您正在控制属性实现   并且不会自动合成实例变量。

由于您未实现 getter ,因此合成了实例变量_stockName。 为此,如果您使用setter的默认名称或自定义名称,则无关紧要。

并声明该物业为“强大的”#34;隐含__strong所有权 关联的实例变量,请参阅"4.1.1. Property declarations" 在" Clang / ARC"文档。

答案 1 :(得分:0)

如果您使用ARC并且指定了strong访问说明符,则属性将包含强引用。 ARC将进行保留/释放。在non arc下覆盖访问器方法不是这样的。你应该处理retain/release。通过setter = mySetter:,您只需为访问者方法指定别名。这对实施没有任何影响。两种方法都做同样的事情。还有一件事mySetter:不会成为stockName的设定者setStockName

答案 2 :(得分:0)

当您向stockName提供strong所有权时,

property会保留strong指针。因此,在这两种情况下,您都将获得strong指针引用。

但是对于您提出的问题,您可以将stockName用作iVarsetter方法和getter方法

问题1

iVar = stockName

getter = [self stockName]self.stockName

setter = [self mySetter:]

问题2

iVar = stockName

getter = [self stockName]self.stockName

setter = self.stockName =[self setStockName:]