2012-03-06 101 views
3

在其中一个Standford IOS tutorials中,教师使用延迟实例化来创建计算器引擎类的实例。如何在目标c中做懒惰的实例化?

他使用在my former question露出的第二语法:

@synthesize myTextField = _myTextField; 

在此语法,吸气myTextField具有_myTextField不同的名称,以便它可以测试

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

如何做到这一点与经典的第一种语法,因为getter和实例变量的名称是相同的(myTextField)?

回答

4

如果使用@sythensize variableName = _variableName;则实例变量将被调用_variableName,这是你需要使用直接访问它的内容。 variableName是用来生成setter和getters的名字,所以如果你使用@synthesize variableName;那么这个实例变量将与合成的setter和getter具有相同的名字。您仍然可以访问实例变量与variableName = ...但其更容易弄混,你应该使用

所以2个懒加载implemetations

@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它更容易阅读和更难以混淆,当你访问变量时,当你意味着二传手,反之亦然

+0

或者只是我们e ARC并忘记您正在设置哪个:) – 2012-03-06 17:16:30

+0

即使使用ARC,也不希望绕过访问者无意中。这打破了KVO以及可能存在于存取器中的任何其他副作用。如果你使用'varName'而不是'self.varName',你会悄悄错过这样的懒惰实例化的副作用。 – 2012-03-06 17:20:52

+0

@ RichardJ.RossIII是使用弧消除了很多内存头痛,但我一般坚持约定,所以你知道你正在访问。同样使用ARC不会改变延迟加载实现,上面的代码适用于ARC和内存管理的应用程序(假设varName被保留) – wattson12 2012-03-06 17:21:07