我一直在学习和使用Objective-C已经有一段时间了(它也是我的第一个OOP语言),我终于想知道如何正确命名合成属性。
让我们采取以下方案:
我有一个名为someVariable
的属性。
@property (nonatomic, retain) NSString *someVariable;
并合成它
@synthesize someVariable;
自定义设置器的外观如何?
1)
我会继续说出类似
的内容-(void)setSomeVariable:(NSString *)someVar{
//input parameter MAY sound/look foreign due to the difference to the property
someVariable = someVar;
}
2)(非法)
但是为了便于阅读和方便,我想将正式参数命名为属性。更喜欢像这样的Java:
-(void)setSomeVariable:(NSString *)someVariable{
//obviously illegal because this would call the setter over and over again
self.someVariable = someVariable;
}
3)(非常规)
根据我过去读过的内容
@synthesize someVariable = _someVariable;
据说是非常规的,不应该被使用。
那么,我是否正确地得出结论,直到现在我一直这样做,是创建自定义setter的唯一方法?
答案 0 :(得分:3)
3)不是非常规的,如果你不提供@synthesize
语句,它正是编译器所做的。
这意味着,如果没有@synthesize
语句和ivar声明,您有一个名为_someVariable
的隐式ivar,而自定义setter通常会有一个名为someVariable
的参数
-(void)setSomeVariable:(NSString *)someVariable {
_someVariable = someVariable;
}
另请注意,为特定属性提供自定义setter 和 getter方法表示Xcode编译器不提供隐式ivar(此处为_someVariable
)。在readonly
属性的情况下,如果只提供getter方法,则为true。
WWDC 2012 session 405提供了有关现代版本编译器的Objective-C构造的大量细节。
修改强>
正如H2CO3在他的回答中所建议的那样,我写的代码假设你正在使用ARC。如果您使用的是MRC,则setter方法更适合:
-(void)setSomeVariable:(NSString *)someVariable {
[someVariable retain];
[_someVariable release];
_someVariable = someVariable;
}