在其中一个Standford IOS tutorials中,讲师使用延迟实例化来创建计算器引擎类的实例。
他使用my former question中公开的第二种语法:
@synthesize myTextField = _myTextField;
在此语法中,getter myTextField
的名称与_myTextField
不同,因此可以测试
if (_myTextField != nil) { ... }
如何使用经典的第一语法执行此操作,因为getter和实例变量名称相同(myTextField
)?
答案 0 :(得分:4)
如果您使用@sythensize variableName = _variableName;
,则实例变量将被称为_variableName
,这是您需要使用它直接访问它。 variableName
是用于生成setter和getter的名称,因此self.variableName or [self setVariableName:...]
如果使用@synthesize variableName;
,则实例变量将与合成的setter和getter具有相同的名称。您仍然可以使用variableName = ...
访问实例变量,但更容易混淆您应该使用哪一个
所以2个延迟加载实现
@synthesize varName = _varName
- (id)varName
{
if (!_varName)
_varName = [[NSObject alloc] init];
return _varName;
}
或
@synthesize varName;
- (id)varName
{
if (!varName)
varName = [[NSObject alloc] init];
return varName;
}
就我个人而言,我选择@synthesize varName = _varName
更容易阅读,当您在设置者时访问变量时更难以混淆,反之亦然