代码之家  ›  专栏  ›  技术社区  ›  BitDrink

使用ib元素实例的访问器有什么好处?

  •  1
  • BitDrink  · 技术社区  · 16 年前

    通常,当我们必须将接口元素链接到类的字段时,我们使用关键字“iboutlet”通知预复制器:

    @interface MyController : NSObject {
        IBOutlet NSWindow *theWindow;
    }
    

    在实现中,我们直接使用指针 theWindow 调用nswindow类的方法!

    但是,告诉预编译器为“窗口”指向的对象创建一些访问器并通过访问器管理对象有什么好处呢?

    例子:

    @interface MyController : NSObject {
       NSWindow *theWindow;
    }
    @property(retain) IBOutlet NSWindow *theWindow;
    
    
    @implementation MyController
    
    @synthesize theWindow;
    
    @end
    

    使用第二个解决方案(对于接口元素的所有指针)是否会降低应用程序的性能?

    什么时候使用第二种方法而不是第一种方法是一个好的实践?

    谢谢您!

    4 回复  |  直到 16 年前
        1
  •  1
  •   Bryan McLemore    16 年前

    好吧,一般来说,我不会保留这些属性,而且我公开插座的唯一方法是,如果有什么东西需要从外部访问元素,这通常对您的设计是个坏兆头。

    我没有尝试过,但是我会尝试只合成读取部分,并且可能只在原子访问重要的地方使用它。AppKit的某些部分并不总是线程安全的。

        2
  •  1
  •   Joshua Nozzi    16 年前

    Bryan是正确的,因为只有在需要从另一个实例或其他类完全访问UI元素属性时,才需要公开它们。它 是 通常是建筑设计问题的标志,但并非总是如此。

    回答最后两个问题:

    使用第二个解决方案(对于接口元素的所有指针)是否会降低应用程序的性能?

    不。只需添加一个名为-dosomethingreallycomplicated的方法,如果从未调用该方法,则会减慢应用程序的速度。它可以缓慢地启动一堆未使用的代码(从而使二进制文件无缘无故地变大),当然也会减慢编译时间,但不会影响应用程序的运行时性能。

    什么时候使用第二种方法而不是第一种方法是一个好的实践?

    正如Bryan所说,当需要从某个类的给定实例外部访问某个UI元素时,可以将它作为属性(通过@synthesis或手工编码的访问器)公开。同样,需要这样做通常是一个设计问题的迹象。

        3
  •  0
  •   Chuck    16 年前

    存取器所花费的时间是完全无法察觉的。即使你运行这段代码上百万次,所有的ib机器都会使它变得非常矮小。

    如果这些变量仅在当时设置,并且从未在类外部访问过,那么访问器可能是不必要的。

        4
  •  0
  •   NSResponder    16 年前

    当一个NIB没有存档时,如果存在一个访问器来设置一个给定的出口,那么无存档者将使用它。如果没有访问器,那么将直接使用obj-c运行时函数按名称查找ivar。

    访问器将更快,因为您将避免在运行时为了找到有问题的ivar而进行的所有艰苦工作。这就是说,除非你要一次又一次地装上那个笔尖,否则差别是可以忽略的。

    您希望为出口使用访问器的主要原因与您希望发布的任何其他IVAR或属性相同。这是确保正确覆盖内存管理的简便方法。

    推荐文章