0

(现在让你知道,我正在学习为 iPhone 开发的一本书,名为《开始 iPhone 3 开发:探索 SDK,并且我不使用接口生成器》)有没有理由在同一本书中使用 getter类,当私有成员可见时?就像在 Foo.h 中一样,有

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

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

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

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

谢谢!!

4

3 回答 3

2

延迟加载吸气剂:

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

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

于 2009-08-02T03:29:01.530 回答
1

是的,通过 getter 访问您的 ivars 比直接访问是一件好事。

举个例子:Cocoa 中的一种正常设计模式(尤其是在资源非常有限的手机上)称为延迟加载。

总而言之,这意味着在需要之前不要加载资源。

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

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

于 2009-08-02T02:13:00.917 回答
1

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

  • 正如其他人所提到的,延迟加载属性
  • 子类可能想要覆盖该属性并让超类尊重
  • 如果您使用原子属性,访问该属性的唯一正确方法是通过 getter
于 2009-08-02T21:51:16.757 回答