1

我已经搜索了几个小时并阅读了很多message sent to deallocated instance帖子,并尝试了这些帖子中建议的方法,但我仍然无法发现导致崩溃的错误。

我尝试启用NSZombieEnabled,MallocStackLoggingMallocStackLoggingNoCompact得到了这一行:

*** -[CFRunLoopTimer release]: message sent to deallocated instance 0x62398f80

但是在我的代码中,我没有使用CFRunLoopTimeror NSTimer

info malloc我得到以下输出:

[Switching to process 97238 thread 0x11903]
sharedlibrary apply-load-rules all 
mygame(97238,0xb01cd000) malloc: recording malloc stacks to disk using standard recorder
(gdb) info malloc 0x62398f80
Alloc: Block address: 0x62398f80 length: 128 
Stack - pthread: 0xac0422c0 number of frames: 41
    0: 0xe9d22 in GMmalloc_zone_malloc_internal
    1: 0xe9ebb in GMmalloc_zone_malloc
    2: 0x142ba88 in __CFAllocatorSystemAllocate
    3: 0x142ba63 in CFAllocatorAllocate
    4: 0x142b8de in _CFRuntimeCreateInstance
    5: 0x147c1c5 in CFRunLoopTimerCreate
    6: 0x32bb831 in _ZN7WebCore22setSharedTimerFireTimeEd
    7: 0x338dd4b in _ZN7WebCore21MainThreadSharedTimer11setFireTimeEd
    8: 0x338daf3 in _ZN7WebCore12ThreadTimers17updateSharedTimerEv
    9: 0x3397781 in _ZN7WebCore9TimerBase15setNextFireTimeEd
   10: 0x339786a in _ZN7WebCore9TimerBase5startEdd
   11: 0x2be78be in _ZN7WebCore5Frame9keepAliveEv
   12: 0x2e86312 in _ZN7WebCore15JSDOMWindowBase10globalExecEv
   13: 0x2ea699a in _ZN7WebCore15JSEventListener11handleEventEPNS_22ScriptExecutionContextEPNS_5EventE
   14: 0x2bc4e02 in _ZN7WebCore11EventTarget18fireEventListenersEPNS_5EventEPNS_15EventTargetDataERN3WTF6VectorINS_23RegisteredEventListenerELm1EEE
   15: 0x2bc4f1c in _ZN7WebCore11EventTarget18fireEventListenersEPNS_5EventE
   16: 0x2bc46ee in _ZN7WebCore11EventTarget13dispatchEventEN3WTF10PassRefPtrINS_5EventEEE
   17: 0x33eb040 in _ZN7WebCore9WebSocket10didConnectEv
   18: 0x33eafa4 in _ZThn20_N7WebCore9WebSocket10didConnectEv
   19: 0x33ed470 in _ZN7WebCore16WebSocketChannel13processBufferEv
   20: 0x33edd18 in _ZN7WebCore16WebSocketChannel14didReceiveDataEPNS_18SocketStreamHandleEPKci
   21: 0x32c681b in _ZN7WebCore18SocketStreamHandle18readStreamCallbackEm
   22: 0x32c68f8 in _ZN7WebCore18SocketStreamHandle18readStreamCallbackEP14__CFReadStreammPv
   23: 0x14c803d in _signalEventSync
   24: 0x14c879a in _cfstream_solo_signalEventSync
   25: 0x14c7e41 in _CFStreamSignalEvent
   26: 0x14c86f7 in CFReadStreamSignalEvent
   27: 0x1ca371 in _ZN12SocketStream40dispatchSignalFromSocketCallbackUnlockedEP24SocketStreamSignalHolder
   28: 0x126011 in _ZN12SocketStream14socketCallbackEP10__CFSocketmPK8__CFDataPKv
   29: 0x125f21 in _ZN12SocketStream22_SocketCallBack_streamEP10__CFSocketmPK8__CFDataPKvPv
   30: 0x1495e14 in __CFSocketPerformV0
   31: 0x14fb94f in __CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE0_PERFORM_FUNCTION__
   32: 0x145eb43 in __CFRunLoopDoSources0
   33: 0x145e424 in __CFRunLoopRun
   34: 0x145dd84 in CFRunLoopRunSpecific
   35: 0x145dc9b in CFRunLoopRunInMode
   36: 0x1d5c7d8 in GSEventRunModal
   37: 0x1d5c88a in GSEventRun
   38: 0x39c626 in UIApplicationMain
   39: 0x3095 in main at /Users/neevek/workspace/xcode_projects/mygame/mygame/main.m:16
   40: 0x2925 in start

编辑

我几乎绝望了,我在这个问题上花了 2 天时间。我唯一能发现的是CFRunLoopTimer僵尸物体。我在我的代码中使用CocoaHttpServer NSURLConnection从某个地方我了解到这NSURLConnection取决于NSRunLoop,所以我想知道是否是NSRunLoop导致崩溃的原因。在我的应用程序中,两者都CocoaHTTPServer依赖NSURLConnectionNSRunLoop,因为它们在不同的线程上运行。

请帮忙!

我使用Instruments找到了僵尸对象,并截取了 2 张崩溃报告截图: 在此处输入图像描述 在此处输入图像描述

[HttpServer bonjourThread]方法:

在此处输入图像描述

4

2 回答 2

1

我已经解决了这个问题,只需在 UIWebView 上调用一个虚拟 stringByEvaluatingJavaScriptFromString,然后再在上下文中调用一个方法。我相信这个工作的原因是对 javascript 的调用是在 Web 线程上完成的,它使用一个计时器来接收返回给主线程的回复,当调用调用时,这个计时器没有被创建,所以当回复从 Web 返回时线程在尝试释放一个从未创建过的计时器时崩溃。通过使用适当的 API stringByEvaluatingJavaScriptFromString in 确保创建计时器,然后 invokeMethod 可以使用相同的计时器。

JSContext* context = [webView valueForKeyPath:@"documentView.webView.mainFrame.javaScriptContext"];
JSValue* value = context[@"Colors"];

// timer CFRelease crash fix
[webView stringByEvaluatingJavaScriptFromString:nil]; 

[value invokeMethod:@"update" withArguments:@[objectID,modifier]];
于 2014-08-30T17:56:29.233 回答
0

根据我的唯一解决方案是在您的代码中搜索 NSTimer-任何第 3 部分库都可以使用它。一旦找到 NSTimer,只需在 NSTimer 初始化结束时添加一个保留语句,如下所示:

idleTimer = [[NSTimer scheduledTimerWithTimeInterval:maxIdleTime
                                                    target:self
                                                    selector:@selector(idleTimerExceeded)
                                                    userInfo:nil
                                                    repeats:NO]retain];
于 2013-10-01T14:26:58.253 回答