代码之家  ›  专栏  ›  技术社区  ›  bastibe

如何在垃圾收集的obj-c中保留窗口而不保留指向它的指针?

  •  1
  • bastibe  · 技术社区  · 15 年前

    我目前正在努力学习Aaron Hillegas的著名“面向OSX的可可编程”。

    在第12章,他想让我用

    [BOOL] successful = [NSBundle loadNibNamed:@"About" owner:self];
    

    就其本身而言,效果非常好。但是,我正在使用垃圾收集器,由于我没有保留关于窗口的指针,所以它是垃圾收集的,因此在一两秒钟后就会消失。如果禁用了垃圾收集,它将工作得非常好。

    有没有一种方法可以创建一个窗口,而不需要持有指向它的指针,也不需要让垃圾收集器吃掉它?

    1 回复  |  直到 15 年前
        1
  •  2
  •   outis    15 年前

    你可以 retain the window 具有 CFRetain 或使用 NSGarbageCollector disableCollectorForPointer: . 但是,您可以很容易地引入内存泄漏。确保您用来关闭窗口的任何操作也会释放窗口。

    如果 sender 传递给Close操作继承自 NSView ,它将有一个 window 属性,可用于获取指向窗口的指针。

    然而,可可的设计并非如此。在希勒加书的第12章中,他说:

    发送ShowWindow时:NSWindowController第一次自动加载NIB文件,并将窗口移动到屏幕和前面。NIB文件只加载一次。当用户关闭[窗口]时,它将移出屏幕,但不会解除分配。下次用户请求[窗口]时,只需在屏幕上移动。

    如果取消分配“关于”窗口,应用程序将崩溃或在第二次有人打开时似乎没有响应。

    编辑:另一种选择(但不给您加载NIB的练习)是将“关于”窗口和NSWindowController添加到主NIB(确保取消选中“关于”窗口的“启动时可见”属性)。这使得main.nib变得一团糟,但完全可以在接口生成器中完成。连接:

    • 关于控制器的窗口出口到关于窗口
    • 关于控制器的 showWindow: “关于”菜单项的操作
    • 如果“关于”窗口中有自己的“关闭”按钮,请将其连接到窗口的 performClose: 行动。

    至于这门课的可取之处, Apple has this to say :

    一个非常简单的应用程序可能能够将其所有用户界面组件存储在一个NIB文件中,但是对于大多数应用程序来说,最好将组件分布在多个NIB文件中。创建较小的NIB文件只允许您立即加载界面的那些部分。较小的NIB文件会为应用程序带来更好的性能。它们还可以更容易地调试您可能遇到的任何问题,因为查找问题的地方更少。