如何销毁(解除分配)从nib文件加载的视图项的实例

时间:2012-02-13 03:55:26

标签: macos cocoa automatic-ref-counting nib memory-management

问题:

  • 每次打开笔尖时,笔尖中的项目的新实例都是 创建,有没有办法摧毁(释放内存)他们?
  • 或者无法取消分配这些观点,直到申请结束?

    提问的理由: 我在需要加载的单独nib文件中有2个视图,因为即使删除了对视图的所有强引用,我也无法销毁nib视图项

尝试了一些步骤(没有成功):

  • 将视图控制器的视图出口设置为nil
  • 窗口控制器有一个视图控制器强大的属性,我已设置 那是

我的理解(基于某些测试)

  • 当我通过代码(使用alloc)创建相同类型的视图而不加载nib文件(NSBundle loadNibNamed)时,我能够销毁视图实例。
  • 但是当视图是由于加载nib文件而创建的时候,虽然我删除了对视图的所有强引用,但视图仍保持打开状态

请注意:这是一个mac cocoa项目并使用自动引用计数(ARC)

我的项目详情:

  • 我有3个nib文件:
    • MyViewA.nib - 包含MyViewA
    • 类型的自定义视图
    • MyViewB.nib - 包含MyViewB
    • 类型的自定义视图
    • MyWindow.nib - 包含NSWindow和自定义视图,让我们调用它 作为viewX供参考
  • 有一个窗口控制器和一个视图控制器
  • MyWindow.nib有2个按钮,一个按钮可将MyViewA作为子视图加载到viewX和 另一个将MyViewB作为子视图加载到viewX
  • 我正在使用NSBundle
  • 加载nib文件
  • 当我尝试向viewX添加新的子视图时,我使用removeFromSuperView删除已存在的子视图并删除对视图的所有强引用

我想在完成使用后删除nib文件项(销毁内存),但我不确定如何实现它。

1 个答案:

答案 0 :(得分:1)

我认为自从您使用NSBundle手动加载笔尖后,您需要手动释放视图。由于您使用的是ARC,因此无法直接调用release,但是您可以将其转换为void *并使用CFRelease,如下所示:

CFRelease((__bridge void *)viewToRelease);