使用访问器对IB元素实例有什么好处?

时间:2009-11-13 17:42:03

标签: objective-c cocoa user-interface accessor

通常,当我们必须将一个界面元素链接到一个类的字段时,我们使用关键字“IBOutlet”来通知预编译器:

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

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

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

示例:

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


@implementation MyController

@synthesize theWindow;

@end

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

何时使用第二种方式而不是第一种方式是一种好习惯?

谢谢!

4 个答案:

答案 0 :(得分:1)

总的来说,我没有保留属性,而且我甚至暴露Outlets的唯一方法是,如果某些东西需要从外部访问元素,这对你的设计来说通常都是一个不好的标志。

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

答案 1 :(得分:1)

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

回答最后两个问题:

  

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

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

  

何时使用第二种方式而不是第一种方式是一种好习惯?

正如Bryan所说,当您需要从该类的给定实例外部访问它时,您将UI元素公开为属性(通过@synthesize或手动编码的访问器)。同样,需要这样做通常是设计问题的标志。

答案 2 :(得分:0)

访问者所花费的时间是完全不可察觉的。即使你运行这个代码数百万次,所有的IB机器都会使它相形见绌。

如果这些变量仅在那时设置并且从不在课外访问,则可能不需要访问器。

答案 3 :(得分:0)

当nib被取消归档时,如果存在设置给定出口的访问者,则unarchiver将使用它。如果没有访问器,则将使用Obj-C运行时函数直接设置ivar以按名称查找。

访问器将更快,因为您将避免通过运行时的所有漏洞来找到有问题的ivar。话虽这么说,除非你一遍又一遍地装上那个笔尖,否则差异可以忽略不计。

您想要插座的访问者的主要原因与您要发布的任何其他ivar或属性相同。这是确保正确覆盖内存管理的一种方便方法。