通常,当我们必须将一个界面元素链接到一个类的字段时,我们使用关键字“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
使用第二个解决方案(对于所有指向接口元素的指针)是否会降低应用程序的性能?
何时使用第二种方式而不是第一种方式是一种好习惯?
谢谢!
答案 0 :(得分:1)
总的来说,我没有保留属性,而且我甚至暴露Outlets的唯一方法是,如果某些东西需要从外部访问元素,这对你的设计来说通常都是一个不好的标志。
我没有尝试过,但我很想只合成读取部分,我可能只会在原子访问重要的地方使用它。 AppKit的某些部分并不总是线程安全。
答案 1 :(得分:1)
Bryan是正确的,因为如果需要从另一个实例或另一个类完全访问它们,您只需要公开UI元素属性。 通常是建筑设计问题的标志,但并非总是如此。
回答最后两个问题:
使用第二个解决方案(对于所有指向接口元素的指针)是否会降低应用程序的性能?
没有。如果从不调用该方法,只需添加一个名为-doSomethingReallyComplicated的方法就会减慢应用程序的速度。它可以减慢启动时出现一堆未使用的代码(从而使二进制文件无缘无故地变大)并且肯定会减慢编译时间,但它不会影响应用程序的运行时性能。
何时使用第二种方式而不是第一种方式是一种好习惯?
正如Bryan所说,当您需要从该类的给定实例外部访问它时,您将UI元素公开为属性(通过@synthesize或手动编码的访问器)。同样,需要这样做通常是设计问题的标志。
答案 2 :(得分:0)
访问者所花费的时间是完全不可察觉的。即使你运行这个代码数百万次,所有的IB机器都会使它相形见绌。
如果这些变量仅在那时设置并且从不在课外访问,则可能不需要访问器。
答案 3 :(得分:0)
当nib被取消归档时,如果存在设置给定出口的访问者,则unarchiver将使用它。如果没有访问器,则将使用Obj-C运行时函数直接设置ivar以按名称查找。
访问器将更快,因为您将避免通过运行时的所有漏洞来找到有问题的ivar。话虽这么说,除非你一遍又一遍地装上那个笔尖,否则差异可以忽略不计。
您想要插座的访问者的主要原因与您要发布的任何其他ivar或属性相同。这是确保正确覆盖内存管理的一种方便方法。