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

以编程方式确定从NIB/XIB加载的COCOA对象是否可用

  •  0
  • jhoff  · 技术社区  · 14 年前

    设置如下:

    • 我在NIB文件中有一个COCOA对象,当nswindow和view被加载时,它被加载。
    • 窗户可以关上
    • 我也以编程方式访问对象

    现在,在某些情况下,当我试图向对象发送消息时,会发生崩溃,但它以前被释放过(因为窗口已关闭)。车祸看起来是这样的:

    Exception Type:  EXC_BAD_ACCESS (SIGSEGV) 
    Exception Codes: KERN_INVALID_ADDRESS at 0x0000000000000017 
    Crashed Thread:  0  
    Dispatch queue: com.apple.main-thread
    
    Application Specific Information: 
    objc_msgSend() selector name: ...
    

    有没有办法检查对象是否可用?检查nil不起作用,它不是nil。可能控制流并不完美,我可以重写应用程序的其他部分来消除这个问题,但我认为这是一个更普遍的问题,我没有解决方案,归根结底就是:

    如何确保从nib加载的对象在释放时设置为nil?

    2 回复  |  直到 14 年前
        1
  •  0
  •   Tobi    14 年前

    我想您可以使用InterfaceBuilder来编写窗口类,在它的dealoc方法中,您可以将变量设置为nil。但不能将对象本身设置为零。变量将保存一个指向对象的指针,如果它取消分配,指针将指向内存中任何东西都可能存在的位置。

    因此,如果您从另一个类访问所述对象,那么您有另一个变量,因此将Windows类中的变量设置为nil,将根本没有用处。

    解决方案非常简单,因为Window类在窗口解除分配时向该对象发送一条释放消息,所以您应该保留对象,以便在另一个类中使用它,然后在完成后释放它。

    如果使用带有retain属性的对象的属性,请不要忘记调用setter with self. .object=……如果没有财产,它可能看起来像这样:

    所以你需要在窗户关上的时候保留你的物品。可能在应用程序调用的第一个viewdidload方法中:

    < PRE> >代码> … -(空)视图加载{ otherClassObject.yourobject=[self.yourobject retain ];

    . >.

    但不能将对象本身设置为零。如果变量释放指针指向内存中任何可能存在的地方,那么该变量将保存指向对象的指针。

    因此,如果您从另一个类访问所述对象,那么您有另一个变量,因此将Windows类中的变量设置为nil,将根本没有用处。

    解决方案非常简单,因为window类在窗口解除分配时向这个对象发送一条释放消息,所以您应该在另一个类中使用它时保留您的对象,然后在完成后释放它。

    如果使用带有retain属性的对象的属性,请不要忘记使用自己对象=…如果没有财产,它可能看起来像这样:

    所以你需要在窗户关上的时候保留你的物品。可能在应用程序调用的第一个viewdidload方法中:

    
    …
    -(空)viewdidload{
    otherClassObject.yourobject=[自我.yourobject保持;
    
    

        2
  •  0
  •   IlDan    14 年前

    尝试在Interface Builder上禁用窗口设置“关闭时释放”。