`
hotfm
  • 浏览: 52528 次
  • 性别: Icon_minigender_1
  • 来自: 北京
最近访客 更多访客>>
社区版块
存档分类
最新评论

解决 EXC_BAD_ACCESS 错误

阅读更多

出现 EXC_BAD_ACCESS  错误,给你的错误提示就这个,如何根本没法知道哪里错误了,其实还是有方法知道的,

做如下设置:

Project -> Edit active executable ->Argument 

添加如下四个参数

NSDebugEnabled

NSZombieEnabled

MallocStackLogging 

MallocStackLoggingNoCompact

并都设置为YES。具体如下图:

 

  这个时候,如果有如下一段代码:

 //重复释放一个变量 

  NSAutoreleasePool* pool = [[NSAutoreleasePool alloc] init];

  NSData* data = [NSData dataWithBytes:"asklaskdxjgr" length:12];

  [data release];

  [pool release];

再Debug窗口会有如下的提示

   2003-03-18 13:01:38.644 autoreleasebug[3939*** *** Selector 'release'

  sent to dealloced instance 0xa4e10 of class NSConcreteData.

 

虽然也能大致判断是哪种类型的变量重复释放了,但信息还不够多,当项目大,源码比较多的时候,也不太方便定位,

在console窗口运行如下命令可以得到更多信息:shell malloc_history <pid> <address>"

 输入命令:shell malloc_history 3939 0xa4e10

 就会出现更多的信息:

  [dave@host193 Frameworks]$ malloc_history 3939 0xa4e10

  Call [2] [arg=32]: thread_a0000dec |0x1000 | start | _start | main |

  +[NSData dataWithBytes:length:] | NSAllocateObject | object_getIndexedIvars |

  malloc_zone_calloc  

这个时候就知道具体哪个函数出先问题了,从这里可以看到main里NSData出现问题了。 

 

2. NSArray等集合类的实用问题。

      如下面的代码    

        ReleaseTest* rt = [[allocinit];

NSMutableArray *array = [[NSMutableArray allocinit] ;

[array addObject: rt];

ReleaseTest *rt2 = [array objectAtIndex:0];

      [rt2 release];   

[array release];

[rt release]; 

     就会导致重复释放内存问题,因为rt2,获取的是一个对象的指针,如果已经释放了的话,rt在释放的话,就重复了,为了遵循谁Init谁Release的原则,rt2就不应该Release。

 

3. init 和 Release 的问题。

    凡是对象通过Init的方法生成的对象,都需要自己负责Release。

    凡不是通过Init的方法生成的对象,不需要负责Release.如[NSString StringWithFormat]方法生成的对象就不需要自己Release,因此自己定义函数,返回一个类的时候,一定要设置为autoRelease 。这样调用的人就不用操心是否需要释放对象了。

 4. AutoReleasePool里最好不要将AutoRelease对象赋值给其它对象,否则离开这个作用域后,对象将会Release掉。

分享到:
评论

相关推荐

    查找EXC_BAD_ACCESS的错误代码处

    为了有效地解决问题并提高应用的稳定性,开发者需要掌握一种有效的调试技巧——使用Xcode内置的Instrument工具来定位和修复`EXC_BAD_ACCESS`错误。 #### 二、Instrument工具简介 Instrument是Xcode集成开发环境中...

    查找 EXC_BAD_ACCESS 问题根源的方法

    #### 一、EXC_BAD_ACCESS 错误简介 EXC_BAD_ACCESS 是一种常见的 Objective-C 编程错误,通常发生在试图访问已释放或未分配的内存时。这类错误往往难以追踪,因为它们可能在程序运行一段时间后才出现,而不是立即...

    ios EXC_BAD_ACCESS错误调试

    在iOS开发中,EXC_BAD_ACCESS错误是一种常见的运行...通过上述步骤,开发者可以有效地定位并解决iOS应用中的EXC_BAD_ACCESS错误。这种问题的解决对于提高应用的稳定性和性能至关重要,也是开发者必须熟练掌握的技术点。

    关于出现僵尸信号SIGBAT或者EXC_BAD_ACCESS的解决方案

    总结来说,解决SIGABRT和EXC_BAD_ACCESS错误需要理解iOS的内存管理机制,启用僵尸模式来定位问题,使用Instruments工具进行深入分析,并审查代码中的对象生命周期管理。对于storyboardDemo项目,通过模拟用户操作和...

    iOS内存错误EXC_BAD_ACCESS的解决方法

    首先说一下 EXC_BAD_ACCESS 这个错误,可以这么说,90%的错误来源在于对一个已经释放的对象进行release操作。举一个简单的例子来说明吧,首先看一段Java代码: 代码如下:public class Test{ public static void ...

    ios-GPUImageFiltersCamera.zip

    出现EXC_BAD_ACCESS。 需要修改Product-&gt;Scheme-&gt;Edit Scheme-&gt;Options-&gt;GPU Frame Capture 选择 Disabled。 功能介绍 模仿Filckr的照相功能实现了: 1.实时滤镜 2.相机基本功能:拍照,对焦,前后...

    CGImageIssueDemo:核心图形问题测试

    CGImageIssueDemo 核心图形问题测试 做什么的 似乎对于iOS 11.2 +, CoreGraphics.framework发生了奇怪的... 这导致EXC_BAD_ACCESS KERN_INVALID_ADDRESS 0x0000000000000000 。 重现步骤 使用CGDataProviderCreateDi

    ios-打印log和奔溃日志.zip

    - **异常类型**: 常见的奔溃原因有EXC_BAD_ACCESS(内存访问错误)、EXC_CRASH(程序异常终止)、SIGABRT(应用程序自己请求退出)等,分析这些异常类型可以帮助定位问题根源。 - **线程信息**: 奔溃日志中的线程...

    GPUImageFiltersCamera相机

    出现EXC_BAD_ACCESS。 需要修改Product-&gt;Scheme-&gt;Edit Scheme-&gt;Options-&gt;GPU Frame Capture 选择 Disabled。 功能介绍 模仿Filckr的照相功能实现了: 1.实时滤镜 2.相机基本功能:拍照,对焦,前后摄像头转换...

    藏经阁-云时代下的 性能优化&运维实践之路.pdf

    1. 应用程序崩溃检测:使用信号捕获机制(EXC_BAD_ACCESS、SIGSEGV、SIGBUS等)来检测应用程序崩溃,通过崩溃日志上报脚本add to build phrase生成日志码力实时告警数据存储,从而实现在应用程序崩溃时快速定位问题...

    iOS-interview-preparation:iOS开发人员面试准备指南

    在什么情况下应用会因EXC_BAD_ACCESS错误而崩溃? 推荐阅读: 自动版面 多任务-GCD,NSOperations等 设计模式-委派,单例,块等 积木 什么是区块?何时在您的应用中使用它们? 块如何使在块外部声明的变量发生...

    Crash log on target platform

    在实际操作中,我们应打开这个文件,查找其中的关键信息,如错误代码(如EXC_BAD_ACCESS、SIGSEGV等),异常类型,以及可能与之相关的线程信息。同时,日志中可能还包含了崩溃前执行的最后几行代码,这对于复现问题...

    iOS Crash日志收集上报

    Mach异常可以是EXC_BAD_ACCESS(内存访问异常)等。Mach异常是通过Mach API暴露给用户态的,可以直接通过Mach API设置thread、task、host的异常端口来捕获Mach异常,抓取Crash事件。 二、Unix Signal Unix Signal...

    iOS崩溃日志解析

    2. **检查异常信息**:有时,崩溃日志会包含异常信息,如`EXC_BAD_ACCESS`或`SIGABRT`,这可以帮助确定问题类型。 3. **查看局部变量和状态**:如果日志包含崩溃时的变量值,可以分析这些值以确定问题所在。 4. **...

    杜蕾斯安全工具

    //EXC_BAD_ACCESS,非ARC正常 } returnnil; } 在几个项目种试了下,没发现啥问题,想用的尽管拿去用,另外非常欢迎参与完善,目前仅替换了几个类,还有很多需要替换的,请在github中关注,工具包以增量的形式,...

    ios解析crash示例文件上传

    - **异常类型**:日志中会显示异常类型,如`EXC_BAD_ACCESS`、`SIGABRT`等,不同类型的异常对应不同的问题。 - **错误信息**:查看错误信息,如`NSException`的`reason`,有助于理解崩溃的具体情况。 - **堆栈...

    iOS 报clang: error: no input files错误的解决方法

    - **iOS内存错误EXC_BAD_ACCESS**:这通常是由于对象已被释放但仍在使用导致的,检查代码中是否有内存管理问题,如未正确使用`strong`、`weak`、`autorelease`等关键字。 - **签名错误codesign failed with exit ...

    如何在xcode里面使用内存泄露查找工具

    6. 当发生内存错误时,比如EXC_BAD_ACCESS,可通过设置环境变量NSZombieEnabled来找出尝试向已经释放的对象发送消息的错误。在Xcode中,可以在运行应用的Schema设置中,将NSZombieEnabled环境变量设置为YES。这允许...

Global site tag (gtag.js) - Google Analytics