【问题标题】:iPhone Dev - Using a getter in the same classiPhone Dev - 在同一个类中使用 getter
【发布时间】:2009-08-02 01:52:38
【问题描述】:

(只是现在让你知道,我正在学习为 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 吗?

谢谢!!

【问题讨论】:

    标签: iphone objective-c properties getter


    【解决方案1】:

    懒加载getter:

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

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

    【讨论】:

    • 谢谢!几个问题: !imageView 和 imageView == nil 一样吗?有了这个 imageView(例如),我会在任何地方使用 self.imageView 吗?你知道 ivar 是什么意思吗?再次感谢!
    • 当作为布尔值访问时,指针在 NULL 时被视为 false,而在任何其他值时被视为 true。因此 !imageView 等价于 (imageView == nil)
    • 是的。我已经使用了 !imageView 符号,因为我正在努力避免陷入我在 iPhone 开发早期犯的错误。 (我正在针对 == YES 或 == NO 测试 BOOL——不推荐,事实证明。)从自我记录的角度来看,imageView == nil 确实更好。
    • 最后说明:您可能认为检查 imageView 是否为非零的额外开销是一个很大的代价。但特别是在 iPhone 上,CPU 周期相对便宜,而且内存非常有限。想象一个由大约一千个数据对象组成的 NSArray,每个对象都有一个与之关联的图像,显​​示在某种表格中。想象一下加载所有这些图像的内存需求(以及 CPU),除非它们被滚动,否则您不会使用它们。(例如,您可能希望创建对象以便获得最少的排序信息。 )
    【解决方案2】:

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

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

    总结一下,就是在需要之前不要加载资源。

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

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

    【讨论】:

    • 是的,这本书的这一部分确实使用了延迟加载..但是你怎么知道的,你没有回答我的问题..
    • 我以为我做到了。 “那么在任何时候都需要在同一个类中使用 getter 吗?”答案 - 是的,当您使用延迟加载时(这是一件好事)。
    • 好的。伊瓦尔是什么意思?延迟加载是通过 getter 访问成员的唯一时间吗?你能告诉我如何为延迟加载制作一个吸气剂吗?
    • 请有人告诉如何制作一个延迟加载的getter,延迟加载是使用self.member的唯一原因,ivar是什么意思?谢谢!
    • ivar = 实例变量,正确编写 getter 的最简单方法是让编译器使用 @properties 和 @synthesize 为您编写它们
    【解决方案3】:

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

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

    【讨论】:

    • 所以基本上如果所有 self.ivar 所做的都是返回 ivar,那么没有区别,所以你不妨只写 ivar。
    • 对;除非您在编写课程时实际上无法确定这一点,因为以后可能会在您不知情的情况下覆盖该课程。当然,如果这只是你的项目,你可以保证自己永远不会那样做。
    猜你喜欢
    • 1970-01-01
    • 2023-03-16
    • 2011-11-03
    • 1970-01-01
    • 1970-01-01
    • 2021-06-12
    • 2023-03-31
    • 2011-06-13
    • 1970-01-01
    相关资源
    最近更新 更多