类方法出现EXC_BAD_ACCESS KERN_INVALID_ADDRESS错误

4

对于类方法,我看到了EXC_BAD_ACCESS KERN_INVALID_ADDRESS错误。

据我所知,类/静态方法不应该出现这种错误。

我是不是错过了什么?

堆栈跟踪:

线程:Crashed: com.apple.root.user-initiated-qos

0 libobjc.A.dylib 0x0000000196eac0b4 objc_retain + 20

1 $APP_NAME 0x00000001002611a8 +[$CLASS_NAME $METHOD_NAME:] ($CLASS_NAME.m:590)

2 libdispatch.dylib 0x0000000197511994 _dispatch_call_block_and_release + 24

3 libdispatch.dylib 0x0000000197511954 _dispatch_client_callout + 16

4 libdispatch.dylib 0x000000019751e780 _dispatch_root_queue_drain + 1848

5 libdispatch.dylib 0x000000019751fc4c _dispatch_worker_thread3 + 108

6 libsystem_pthread.dylib 0x00000001976f121c _pthread_wqthread + 816

7 libsystem_pthread.dylib 0x00000001976f0ee0 start_wqthread + 4


这取决于正在访问什么。你有堆栈跟踪吗? - Phillip Mills
@Phillip Mills 这是一种简单的跟踪方法,调用分析库进行统计。 - k-thorat
$CLASS_NAME.m文件中的第590行是什么样子? - Phillip Mills
第590行是类方法的名称 -> + (void)methodName:(NSObject*)model - k-thorat
3个回答

8
我曾多次看到这种崩溃(非常相似,如果不是完全相同的堆栈跟踪),发现这与在同时设置新对象的非原子属性并读取该属性有关。
那个objc_retain +20指令最终成为了对正在被读取的对象的isa属性的调用——但此时该对象已经被释放,isa指针被更改为错误地址。
我通过遵循Mike Ash的博客文章来调试我的问题:https://www.mikeash.com/pyblog/tales-from-the-crash-mines-issue-1.html 我强烈建议通读整篇文章——它涉及使用反汇编器进行调试,但对我们来说肯定是救命稻草。
编辑:请注意,我甚至不确定这是否是您的问题,但我希望我的经验能为您节省一些时间。我知道我花了很多工作周来调试这些类似的问题,但我还是没有百分之百的把握。

谢谢 A O,我会仔细阅读这篇文章。 - k-thorat

1
这个崩溃是因为悬空指针造成的。例如,当变量或对象试图访问已经被释放的对象时。
附注:大多数人可能会对“内存泄漏”和“悬空指针”感到困惑。
当指针引用已经被释放的内存时,就会发生“悬空指针”。当内存仍然被分配但没有任何引用时,就会发生“内存泄漏”。

0

EXC_BAD_ACCESS通常意味着您正在向无效的内存地址发送Objective C 消息

这可能会导致:

1. An object that you want to use which has been deallocated.
2. When any variable or object is trying to access restricted memory. That means such crash occurs due to memory leak.

是的,我理解。您能解释一下如何使用类方法吗?因为类方法预计为其所有工作分配内存,并在完成后进行释放。 - k-thorat
最好使用仪器工具来测试内存。 - Jamil
你能提供完整的崩溃日志吗?这样我就可以找到导致崩溃的类/方法/对象了。 - Jamil

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接