2009-11-13 31 views
1

通常情况下,当我们有一个界面元素链接到一个类的字段,我们使用关键字“IBOutlet中”通知预copiler:使用访问器对IB元素实例有什么优势?

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

,并在执行我们直接指针theWindow使用调用NSWindow类的方法!

但是,告诉预编译器创建一些访问器以访问由“theWindow”指向的对象并通过访问器管理对象有什么优势?

实施例:

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


@implementation MyController 

@synthesize theWindow; 

@end 

是否使用第二溶液的(对于所有指针接口的元素)减慢了应用程序的性能?

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

谢谢!

回答

1

那么一般来说,我不保留这些属性,而且我甚至公开过Outlets的唯一方法就是如果某件事需要从外部访问某个元素,并且这对于您的设计来说通常是一个不好的迹象。

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

0

存取器所花费的时间是完全不可察觉的。即使你运行这个代码数百万次,所有的IB机器都会积极地把它淹没。

如果这些变量只在那个时间设置,并且从不在类之外访问,那么访问器可能是不必要的。

1

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

要回答的最后两个问题:

是否使用第二液(所有指针接口的元素)减缓了应用程序的性能?

不是,添加一个名为-doSomethingReallyComplicated的方法会降低应用程序的速度,如果永远不会调用该方法。它可能会减慢启动时产生的一堆未使用的代码(从而使得二进制文件无缘无故地增大),并且肯定会减慢编译时间,但它不会影响应用程序的运行时性能。

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

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

0

当一个笔尖被解除存档时,如果存在一个存取器来设置给定的插座,那么unarchiver将使用它。如果没有访问者,那么将直接使用Obj-C运行时函数来设置ivar,以便按名称查找它。

访问者将会更快,因为您将避免通过运行时查找所有有问题的伊娃。话虽如此,除非你一遍又一遍地加载这个笔尖,否则差异可以忽略不计。

你想要一个插座的访问器的主要原因与你想发布的任何其他伊娃或财产相同。这是确保内存管理得到正确覆盖的一种方便方法。

相关问题