Objective c 在实例方法中访问super如何导致EXC\u BAD\u访问?

Objective c 在实例方法中访问super如何导致EXC\u BAD\u访问?,objective-c,pointers,memory-management,Objective C,Pointers,Memory Management,在一个实例方法中,我在超类上调用相同的选择器,并获得EXC_BAD_访问权。我使用的是手动引用计数(不是ARC),这是在主线程中发生的。静态分析报告没有问题,我并不认为这意味着一份干净的健康清单。有关守则如下: CommentListMedia.m(堆栈下面跟踪中的第1帧): 这可能是-[SequentialMedia play]中的崩溃。具体来说,如果该方法返回void并作为该方法中的最后一个表达式进行调用,则可能是[Optimization]编译器生成了尾部调用。这将有效地导致方法调用从堆栈

在一个实例方法中,我在超类上调用相同的选择器,并获得EXC_BAD_访问权。我使用的是手动引用计数(不是ARC),这是在主线程中发生的。静态分析报告没有问题,我并不认为这意味着一份干净的健康清单。有关守则如下:

CommentListMedia.m(堆栈下面跟踪中的第1帧):

这可能是
-[SequentialMedia play]
中的崩溃。具体来说,如果该方法返回
void
并作为该方法中的最后一个表达式进行调用,则可能是[Optimization]编译器生成了尾部调用。这将有效地导致方法调用从堆栈中消失

发布崩溃报告中寄存器的内容$r0可以非常有启发性(因为它是第一个arg,应该是一个可行的对象)

此外,如果程序中存在严重的并发性,则可能是该对象正由辅助线程释放和释放。但是,通常情况下,您会看到不止一种奇怪的崩溃(尽管有时不会,如果您的代码大量使用同步原语,那么并发程序在不同的运行中表现出的一致性可能会非常显著)

这可能是
-[SequentialMedia play]
中的崩溃。具体来说,如果该方法返回
void
并作为该方法中的最后一个表达式进行调用,则可能是[Optimization]编译器生成了尾部调用。这将有效地导致方法调用从堆栈中消失

发布崩溃报告中寄存器的内容$r0可以非常有启发性(因为它是第一个arg,应该是一个可行的对象)



此外,如果程序中存在严重的并发性,则可能是该对象正由辅助线程释放和释放。但是,通常情况下,您会看到不止一种奇怪的崩溃(尽管有时不会,如果您的代码大量使用同步原语,那么并发程序在运行之间的行为一致性可能会非常显著)。

我认为您可能误解了这里的堆栈跟踪,也就是说,我不明白你是如何得出“超级”引用有问题的结论的。从这个堆栈跟踪中,我唯一看到的是play方法被发送到CommentListMedia类,我只能假设MediaControls是从CommentListMedia继承的。如果您在两个类的description+play方法中都添加了类层次结构,这将非常有用。您能发布崩溃后的堆栈跟踪吗?@lawicko我从堆栈跟踪中编辑了行号,因为它们对代码段没有多大意义,但我在代码段中用注释标记了堆栈中为项目1指定的行。我还包括了另一个类的代码片段,并澄清了层次结构。@RyanR我确实发布了堆栈跟踪;您还需要什么吗?我的钱在异常报告上,由于版本中的代码优化,它给了您一个稍微不正确的行号。我认为真正的异常发生在您检查comments对象属性的上面两行。我认为您可能误解了这里的堆栈跟踪,即我不明白您是如何得出“super”引用有问题的结论的。从这个堆栈跟踪中,我唯一看到的是play方法被发送到CommentListMedia类,我只能假设MediaControls是从CommentListMedia继承的。如果您在两个类的description+play方法中都添加了类层次结构,这将非常有用。您能发布崩溃后的堆栈跟踪吗?@lawicko我从堆栈跟踪中编辑了行号,因为它们对代码段没有多大意义,但我在代码段中用注释标记了堆栈中为项目1指定的行。我还包括了另一个类的代码片段,并澄清了层次结构。@RyanR我确实发布了堆栈跟踪;您还需要什么吗?我的钱在异常报告上,由于版本中的代码优化,它给了您一个稍微不正确的行号。我认为真正的异常发生在你检查comments对象属性的上面两行。这真的很有趣,也正是我想要的调试技巧。不幸的是,Crashlytics似乎没有给我寄存器值,到目前为止,我在iTunes Connect中也没有看到任何崩溃报告(这并不奇怪)。但无论如何,[SequentialMedia play]会返回无效状态,在某些情况下会以一个电话结束,所以我会继续走这条路,看看它会把我带到哪里。@JesseCrossen它可能不会有任何结果,但是,在调试这些恼人的问题时,即使是一根很弱的稻草也比没有稻草要好。这根稻草比我拥有的任何东西都强得多。:)我将把这个标记为答案,因为您对跟踪结果的解释回答了我的问题,即超级呼叫如何可能是崩溃的原因。根据您的指示,还发现了一些潜在问题和修复,但在下周某个时候应用程序更新获得批准之前,我不知道它们是否有效。谢谢!你的直觉证明是正确的。我还没有修复这个bug,但至少现在我知道什么东西被过度发布了。这真的很有趣,正是我想要的调试技巧。不幸的是,Crashlytics似乎没有给我寄存器值,到目前为止,我在iTunes Connect中也没有看到任何崩溃报告(这并不奇怪)。但无论如何,[顺序媒体播放]确实会返回无效状态,在某些情况下会以呼叫结束,因此我将继续这条路线,看看它会带我去哪里。@JesseCrossen它可能不会有任何结果,但是,在调试这些恼人的问题时,即使是一根很弱的稻草也比没有s好
- (void)play {
  if ((comments.isLoading) && (! comments.isLoaded)) 
    playWhenLoaded = YES;
  else [super play]; // <-- EXC_BAD_ACCESS happens here
}
- (void)play {
  [media play]; // <-- this calls the code above
  [self notifyWithName:MediaControlsDidPlayNotification];
}
- (void)sendEvent:(UIEvent *)event {
  [super sendEvent:event]; // <-- this calls the code above
  ...
}
0   libobjc.A.dylib   objc_msgSend + 5
1   MyApp             -[CommentListMedia play]
2   MyApp             -[MediaControls play]
3   UIKit             -[UIApplication sendAction:to:from:forEvent:] + 90
4   UIKit             -[UIApplication sendAction:toTarget:fromSender:forEvent:] + 30
5   UIKit             -[UIControl sendAction:to:forEvent:] + 44
6   UIKit             -[UIControl _sendActionsForEvents:withEvent:] + 374
7   UIKit             -[UIControl touchesEnded:withEvent:] + 590
8   UIKit             -[UIWindow _sendTouchesForEvent:] + 528
9   UIKit             -[UIWindow sendEvent:] + 832
10  UIKit             -[UIApplication sendEvent:] + 196
11  MyApp             -[MyApp sendEvent:]
12  UIKit             _UIApplicationHandleEventQueue + 7096
13  CoreFoundation    __CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE0_PERFORM_FUNCTION__ + 14
14  CoreFoundation    __CFRunLoopDoSources0 + 206
15  CoreFoundation    __CFRunLoopRun + 622
16  CoreFoundation    CFRunLoopRunSpecific + 522
17  CoreFoundation    CFRunLoopRunInMode + 106
18  GraphicsServices  GSEventRunModal + 138
19  UIKit             UIApplicationMain + 1136
20  MyApp             main
0   libobjc.A.dylib   objc_msgSend + 5
1   MyApp             -[CommentListMedia play]