Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c EXC_BAD_在main()中使用ARC进行访问,但没有错误提示_Objective C_Cocoa Touch_Debugging_Crash_Exc Bad Access - Fatal编程技术网

Objective c EXC_BAD_在main()中使用ARC进行访问,但没有错误提示

Objective c EXC_BAD_在main()中使用ARC进行访问,但没有错误提示,objective-c,cocoa-touch,debugging,crash,exc-bad-access,Objective C,Cocoa Touch,Debugging,Crash,Exc Bad Access,我的想法快用完了。我在使用ARC的项目上收到了一个EXC\u BAD\u访问权限。根据调试器,它位于main()中。NSZombieEnabled设置为YES,但我没有看到任何调用堆栈、类/类型或任何东西。检查员/个人资料也一样。我得到的只是应用程序崩溃后一段时间的“会话超时” 在我的代码中很难找到它 我正在设置这样的跟踪 NSLog(@"CrashLog: <%@:%@:%d:%s>", NSStringFromClass([self class]), NSStringFromSe

我的想法快用完了。我在使用ARC的项目上收到了一个
EXC\u BAD\u访问权限。根据调试器,它位于
main()
中。NSZombieEnabled设置为YES,但我没有看到任何调用堆栈、类/类型或任何东西。检查员/个人资料也一样。我得到的只是应用程序崩溃后一段时间的“会话超时”

在我的代码中很难找到它

我正在设置这样的跟踪

NSLog(@"CrashLog: <%@:%@:%d:%s>", NSStringFromClass([self class]),
NSStringFromSelector(_cmd), __LINE__, __FILE__);

尝试使用instruments(产品>配置文件)运行应用程序,并选择泄漏模板。它可能会提示您错误在哪里

使用ARC仍然有办法获得EXC\u BAD\u访问权限。我遇到的一些

  • 如果您正在做一些事情,其中您创建了一个对象,它会异步回调您——您必须确保在某个地方保留对它的引用,否则ARC将释放它。一个例子是UIImagePicker——您不能只创建一个本地图像选择器变量并调用它(然后在它回调时释放它)——您必须创建一个属性并保留它

  • 如果您不总是使用属性来保持它,您可能会遇到麻烦--ARC使用强弱的存在来知道该做什么--如果您使用ivar,您可能会愚弄ARC(对此不是100%确定)。确保不这样做的一个简单方法是使用
    @synthetic var=\u var
    而不是让属性和ivar具有相同的名称。这样,如果您忘记了self.var=obj
  • 而只使用了
    var=obj
    ,它就会抱怨

  • 我在手势和选项卡中遇到了一个错误--选项卡视图没有保留IB添加的手势--我在这里记录了它

  • 在这些情况下,僵尸应该会有所帮助——因此,没有帮助意味着您可能不会过早地导致发布。更可能的情况是,您正在消耗内存——我会检查所有类型转换以及使用内置数组或非对象指针的任何位置,以确保您没有超出范围。卫兵马洛克可以帮忙


    听起来好像您没有设置异常断点。默认情况下,Xcode不会创建一个。打开断点导航器(cmd+6),单击左下角的+并从弹出的菜单中选择“添加异常断点”。单击“完成”,您应该会发现您现在已接近问题所在的位置


    如果没有这一点,您通常会发现调试器会将您转储到
    main
    中,而堆栈跟踪中没有关于您是如何到达那里的提示。

    好了,我终于明白了

    我还不知道哪个细节是错的。最后我发现这个问题与UITextView有关。最初,文本视图不可编辑。但我想接收触摸事件。因此,我遵循了hiere给出的一个建议: 我将“self”(UIViewController子类)指定为UITextView的委托,并以这种方式勉强实现了协议:

    - (BOOL)textViewShouldBeginEditing:(UITextView *)textView{
        [self userShow:nil]; //Within this method a subsequent UIViewController subclass/object is created and pushed.
        return FALSE;
    }
    
    - (BOOL)textViewShouldEndEditing:(UITextView *)textView{
        return TRUE;
    }
    
    - (void)textViewDidBeginEditing:(UITextView *)textView{
        return;
    }
    
    - (void)textViewDidEndEditing:(UITextView *)textView{
        return;
    }
    
    
    - (BOOL)textView:(UITextView *)textView shouldChangeTextInRange:(NSRange)range replacementText:(NSString *)text{
        return TRUE;
    }
    
    - (void)textViewDidChange:(UITextView *)textView{
        return;
    }
    
    - (void)textViewDidChangeSelection:(UITextView *)textView{
        return;
    }
    
    其目的实际上是避免编辑,但在用户触摸UITextView区域并调用某些操作时接收事件。在本例中,创建了一些后续视图控制器并将其推送到导航堆栈。它工作正常,但一段时间后,在某些情况下,应用程序在几分钟内(!)崩溃。多亏了娄的回答和他的博客,我才能够让EXC_BAD_访问更接近textViewShouldBeginEditing。类似于earler desparate绕过EXC_BAD_访问的尝试,我注释掉了UITextView并调用了视图控制器,以便使用其他UIButton项调用它。(只是一个快速临时解决方案) 幸运的是,这成功了。应用程序不再崩溃。现在我将介绍一些更复杂的实现,它将带来相同的用户体验,但以不同但节省的方式调用另一个视图控制器


    我会提供这个答案,以防其他人遇到同样的问题。如果你手头有一个解释,到底是哪个细节导致了这个问题,那么你的点击是非常感谢的

    对不起,我没有提到我已经这么做了。不管怎样,谢谢你,卢。1。我使用异步http请求来实现这一点。但是,我非常确定我取消了请求对象的调试方法中所有打开的连接。不过我会再检查一遍。谢谢。我将再次检查我是否在所有相关案例中使用self.var。3.根本不应应用于我的应用程序。然而,你能更具体一点关于“guard malloc”吗。这对我来说不是新闻,就是我没有真正理解你的意思。(英语不是我的母语)。到目前为止非常感谢。请按照链接获取Guard Malloc帮助。它使堆对问题更加敏感。这不是直接的帮助。然而,按照建议,及时窗口明显缩小。如果你有一个想法,至少你知道该看什么或寻找什么,那么找到一些根本原因就容易多了。您正在运行一个很棒的博客。:)很高兴这有帮助。问题最终是什么?啊,谢谢你!这正是我的原因。不,这并没有让我走得更远。没有任何变化。
    - (BOOL)textViewShouldBeginEditing:(UITextView *)textView{
        [self userShow:nil]; //Within this method a subsequent UIViewController subclass/object is created and pushed.
        return FALSE;
    }
    
    - (BOOL)textViewShouldEndEditing:(UITextView *)textView{
        return TRUE;
    }
    
    - (void)textViewDidBeginEditing:(UITextView *)textView{
        return;
    }
    
    - (void)textViewDidEndEditing:(UITextView *)textView{
        return;
    }
    
    
    - (BOOL)textView:(UITextView *)textView shouldChangeTextInRange:(NSRange)range replacementText:(NSString *)text{
        return TRUE;
    }
    
    - (void)textViewDidChange:(UITextView *)textView{
        return;
    }
    
    - (void)textViewDidChangeSelection:(UITextView *)textView{
        return;
    }