1

通常,当我们必须将接口元素链接到类的字段时,我们使用关键字“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

4 回答 4

1

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

回答最后两个问题:

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

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

什么时候使用第二种方式而不是第一种方式是一个好习惯?

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

于 2009-11-13T17:55:40.847 回答
1

好吧,一般来说,我不保留属性,我什至暴露 Outlets 的唯一方法是,如果某些东西需要从外部访问元素,这通常对您的设计来说是一个不好的迹象。

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

于 2009-11-13T17:47:16.200 回答
0

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

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

于 2009-11-13T17:52:09.480 回答
0

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

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

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

于 2009-11-13T18:41:02.330 回答