iPhone Dev - 在同一个类中使用getter

时间:2009-08-02 01:52:38

标签: iphone objective-c properties getter

(只是为了让你现在,我正在学习为iPhone开发一本名为Beginning iPhone 3开发的书:探索SDK,我不使用Interface builder) 私有成员可见时,是否有理由在同一个类中使用getter?就像在Foo.h中一样,

NSObject *myObj;
...
@property (nonatomic, retain)NSObject *myObj;

然后在Foo.m中,使用self.myObj(或[self myObj])访问成员 myObj ?因为在我的书中,这是它告诉你在其中一个应用程序中写的内容(它检查UIViewController成员的视图是否在superview中):

if(self.yellowViewController.view.superview == nil) {

(注意自我 .yellowViewController ......) 这有什么原因吗?如果我没有一个想法可能是因为成员blueViewController是BlueViewController类,所以我认为如果没有理由它可能不会引起混淆。那么在任何时候需要在同一个类中使用getter吗?

谢谢!

3 个答案:

答案 0 :(得分:2)

延迟加载getter:

- (UIImageView*) getImageView
{
    if (!imageView)
    {
        imageView = [[UIImageView alloc] initWithImage: [UIImage imageNamed: @"blah.png"]]; // just an example
    }
    return imageView;
}

根据imageView的定义方式(复制,分配,保留),您需要修改实际的赋值,但这就是延迟加载的含义。

答案 1 :(得分:1)

是的,通过吸气剂直接访问您的ivars是一件好事。

作为一个例子:Cocoa中的一个正常的设计模式(特别是在电话上,资源非常有限)被称为延迟加载。

总结一下,这意味着在您需要之前不要加载资源。

理想情况下,您可能希望在getter中放置代码,以检查是否加载了请求的资源,如果没有,则加载它。直接访问ivar只会返回nil。另一种方法是在初始化父类时初始化所有的ivars,从而可能浪费资源来存储可能需要或可能不需要的数据。

这也允许您潜在地放置可能在applicationDidReceiveMemoryWarning:方法中再次检索的资源,并在资源紧张时将其转储,因为它们将在需要时根据需要再次加载。

答案 2 :(得分:1)

使用self.ivar getter语法而不是直接访问实例变量的几个原因:

  • 其他人提到的延迟加载属性
  • 子类可能希望覆盖该属性并使超类尊重
  • 如果您使用原子属性,访问该属性的唯一正确方法是通过getter