我目前正在研究 Aaron Hillegaas 著名的“OSX 可可编程”。
在第 12 章中,他希望我使用
[BOOL] successful = [NSBundle loadNibNamed:@"About" owner:self];
就其本身而言,它运作良好。但是,我正在使用垃圾收集器,并且由于我没有保留指向关于窗口的指针,因此它被垃圾收集,因此在一两秒后消失。如果禁用垃圾收集,它会很好地工作。
有没有办法在不持有指向它的指针且不被垃圾收集器吃掉的情况下创建一个窗口?
我目前正在研究 Aaron Hillegaas 著名的“OSX 可可编程”。
在第 12 章中,他希望我使用
[BOOL] successful = [NSBundle loadNibNamed:@"About" owner:self];
就其本身而言,它运作良好。但是,我正在使用垃圾收集器,并且由于我没有保留指向关于窗口的指针,因此它被垃圾收集,因此在一两秒后消失。如果禁用垃圾收集,它会很好地工作。
有没有办法在不持有指向它的指针且不被垃圾收集器吃掉的情况下创建一个窗口?
您可以使用保留窗口,CFRetain
也可以使用NSGarbageCollector
's disableCollectorForPointer:
。但是,您很容易引入内存泄漏。确保用于关闭窗口的任何操作也会释放窗口。
如果sender
传递给 close 动作继承自NSView
,它将有一个window
属性,您可以使用它来获取指向窗口的指针。
然而,这不是 Cocoa 的设计方式。在 Hillegaas 书的第 12 章中,他这样说:
当第一次发送 showWindow: 时,NSWindowController 会自动加载 nib 文件并将窗口移动到屏幕上并移到前面。nib 文件只加载一次。当用户关闭 [window] 时,它会移出屏幕但不会被释放。下次用户请求 [window] 时,它只是在屏幕上移动。
如果您取消分配“关于”窗口,您的应用程序将在有人第二次打开它时崩溃或似乎没有响应。
编辑:另一种方法(但不会让您练习加载 nib)是将 About 窗口和 NSWindowController 添加到主 nib(确保取消选中 About 窗口的“Visible At Launch”属性)。这会使 Main.nib 变得一团糟,但可以完全在 Interface Builder 中完成。连接:
showWindow:
对 About 菜单项的操作performClose:
操作。至于这门课程的可取性,Apple 有这样的说法:
一个非常简单的应用程序可能能够将其所有用户界面组件存储在一个 nib 文件中,但对于大多数应用程序来说,最好将组件分布在多个 nib 文件中。创建较小的 nib 文件可以让您仅加载您立即需要的界面部分。较小的 nib 文件可为您的应用程序带来更好的性能。它们还使调试您可能遇到的任何问题变得更容易,因为查找问题的地方更少。