(现在让您知道,我正在通过一本名为《Beginning iPhone 3 Development》的书来学习 iPhone 开发:探索SDK,而我不使用接口构建器)当可见私人成员时,是否有理由在同一类中使用Getter?就像在 Foo.h 中一样,有

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

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

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

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

谢谢!!

有帮助吗?

解决方案

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

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

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

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

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

其他提示

延迟加载getter:

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

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

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

  • 正如其他人提到的,延迟加载属性
  • 子类可能想要覆盖该属性并让超类尊重该属性
  • 如果使用原子属性,访问该属性的唯一正确方法是通过 getter
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top