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

NSDrawer委托指向解除分配的对象?

  •  0
  • Isaac  · 技术社区  · 16 年前

    如果我解释正确的话,崩溃是由于试图发送 drawerDidOpen: 抽屉抽屉: 是出票人的委托对象(没有任何对象注册以接收出票人通知),出票人的委托对象通过XIB/NIB文件实例化,连接到出票人的委托出口,而不在其他任何地方引用。

    考虑到这一点,我如何防止代理在出票人通知之前被解除锁定?或者,我误解了什么可能导致了这次事故?

    崩溃日志/堆栈跟踪:

    Exception Type:  EXC_BAD_ACCESS (SIGSEGV)
    Exception Codes: KERN_INVALID_ADDRESS at 0x0000000000000010
    Crashed Thread:  0  Dispatch queue: com.apple.main-thread
    
    Application Specific Information:
    objc_msgSend() selector name: drawerDidOpen:
    
    Thread 0 Crashed:  Dispatch queue: com.apple.main-thread
    0   libobjc.A.dylib                 0x00007fff8272011c objc_msgSend + 40
    1   com.apple.Foundation            0x00007fff87d0786e _nsnote_callback + 167
    2   com.apple.CoreFoundation        0x00007fff831bcaea __CFXNotificationPost + 954
    3   com.apple.CoreFoundation        0x00007fff831a9098 _CFXNotificationPostNotification + 200
    4   com.apple.Foundation            0x00007fff87cfe7d8 -[NSNotificationCenter postNotificationName:object:userInfo:] + 101
    5   com.apple.AppKit                0x00007fff8512e944 _NSDrawerObserverCallBack + 840
    6   com.apple.CoreFoundation        0x00007fff831d40d7 __CFRunLoopDoObservers + 519
    7   com.apple.CoreFoundation        0x00007fff831af8c4 CFRunLoopRunSpecific + 548
    8   com.apple.HIToolbox             0x00007fff839b8ada RunCurrentEventLoopInMode + 333
    9   com.apple.HIToolbox             0x00007fff839b883d ReceiveNextEventCommon + 148
    10  com.apple.HIToolbox             0x00007fff839b8798 BlockUntilNextEventMatchingListInMode + 59
    11  com.apple.AppKit                0x00007fff84de8a2a _DPSNextEvent + 708
    12  com.apple.AppKit                0x00007fff84de8379 -[NSApplication nextEventMatchingMask:untilDate:inMode:dequeue:] + 155
    13  com.apple.AppKit                0x00007fff84dae05b -[NSApplication run] + 395
    14  com.apple.AppKit                0x00007fff84da6d7c NSApplicationMain + 364
    15  (my app's identifier)           0x0000000100001188 start + 52
    

    编辑 :澄清一下:在几乎相同的使用场景中,此崩溃在成千上万个甚至上万个场景中发生过一次。我不在代码中的任何地方保留/release/alloc/dealloc/anything内存管理委托对象;我不为我代码中的任何抽屉通知注册任何对象;我的代码没有指向委托对象的变量(或ivar)。

    1 回复  |  直到 16 年前
        1
  •  1
  •   bbum    16 年前

    NSNotificationCenter's -removeObserver: 方法 -dealloc 方法。


    setDelegate: (通过NIB文件),它是作为通知观察者来完成的。

    retain

    在任何情况下,您都需要确保您的委托在其有效期内被某个地方保留。