如何在目标c中进行惰性实例化?

时间:2012-03-06 16:54:24

标签: iphone objective-c cocoa

在其中一个Standford IOS tutorials中,讲师使用延迟实例化来创建计算器引擎类的实例。

他使用my former question中公开的第二种语法:

@synthesize myTextField = _myTextField;

在此语法中,getter myTextField的名称与_myTextField不同,因此可以测试

if (_myTextField != nil) { ... }

如何使用经典的第一语法执行此操作,因为getter和实例变量名称相同(myTextField)?

1 个答案:

答案 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更容易阅读,当您在设置者时访问变量时更难以混淆,反之亦然