首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

为什么在NSArray InitWithObjects期间此代码会因EXC_BAD_ACCESS而崩溃

在Objective-C中,NSArray的初始化方法initWithObjects期间发生EXC_BAD_ACCESS错误通常是由于内存管理问题导致的。以下是一些可能的原因和解决方案:

  1. 内存管理问题:
    • 确保在初始化NSArray时,所有传入的对象都已经正确地分配了内存。
    • 确保在initWithObjects方法中传入的对象都是有效的对象,而不是nil
    • 确保在initWithObjects方法中传入的对象都是已经正确地初始化的。
  2. 对象的生命周期问题:
    • 确保在initWithObjects方法中传入的对象在NSArray的整个生命周期中都是有效的。如果这些对象在NSArray的生命周期内被释放,那么在尝试访问这些对象时会导致EXC_BAD_ACCESS错误。
  3. 数组元素数量问题:
    • 确保在initWithObjects方法中传入的元素数量与预期的元素数量相匹配。如果传入的元素数量与预期的元素数量不匹配,那么在尝试访问这些元素时会导致EXC_BAD_ACCESS错误。
  4. 内存泄漏问题:
    • 确保在initWithObjects方法中传入的对象没有内存泄漏。如果这些对象存在内存泄漏,那么在尝试访问这些对象时会导致EXC_BAD_ACCESS错误。

为了避免EXC_BAD_ACCESS错误,可以采取以下措施:

  1. 使用ARC(自动引用计数):ARC可以自动管理内存,避免内存泄漏和EXC_BAD_ACCESS错误。
  2. 使用NSArray的类方法arrayWithObjects:初始化数组,而不是直接使用initWithObjects方法。这样可以确保在初始化数组时,所有传入的对象都已经正确地分配了内存。
  3. 在使用initWithObjects方法之前,确保所有传入的对象都已经正确地初始化。
  4. 在使用initWithObjects方法之前,确保所有传入的对象都是有效的对象,而不是nil
  5. 在使用initWithObjects方法之前,确保所有传入的对象的生命周期都是有效的。
  6. 在使用initWithObjects方法之前,确保传入的元素数量与预期的元素数量相匹配。
  7. 在使用initWithObjects方法之前,确保所有传入的对象没有内存泄漏。

总之,要解决NSArrayinitWithObjects期间因EXC_BAD_ACCESS而崩溃的问题,需要仔细检查传入的对象是否正确地初始化、分配内存、释放和管理。同时,使用ARC和遵循良好的内存管理实践也可以有效地避免这种问题。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

RunLoop总结:RunLoop的应用场景(五)阻止App崩溃一次

IOS程序异常crash捕获与拦截 (我下面的Demo 就是在这部分代码上做了简化,以方便理解) 原理 iOS应用崩溃,常见的崩溃信息有EXC_BAD_ACCESS、SIGABRT XXXXXXX,而这里分为两种情况...我们收集App崩溃信息时,需要添加一个函数 NSSetUncaughtExceptionHandler(&HandleException),参数 是一个回调函数,回调函数里获取到异常的原因,当前的堆栈信息等保存到...(代码见末尾的Demo) 第二步,单例中对象实例化时,添加 异常捕获 和 signal 处理的 回调函数。...第五步,写一段导致崩溃代码 我是ViewController 中添加了一个点击事件,弄了一个数组越界的Bug: - (void)touchesBegan:(NSSet *)touches...遇到数组越界,应用依然没崩溃 sunnyxx 称之为回光返照,为什么呢? 我再一次点击视图,应用依然还是崩溃了,只能防止第一次崩溃。 我测试了,确实是第二次应用崩溃,未能起死回生。

1.6K31

扒虫篇-崩溃日志解读及Crash收集

代码如下 @try { //如果@try中的代码导致程序崩溃,就会来到@catch //将一个nil插入到可变数组中,这行代码肯定有问题 [arrayM addObject...还一种崩溃的情况是 EXC_BAD_ACCESSEXC_BAD_ACCESS异常的本意是指访问不到内存中这个地址的值,可能是由于些变量已经被回收了,亦可能是由于使用栈内存的基本类型的数据赋值给了id...当遇到这种错误, 控制一般不会给你很多关于崩溃的信息, 这种崩溃你开启僵尸对象模式即可, 不过记住你正式发布的时候记得把这个勾取消, 不然造成内存泄漏。....dSYM文件中每一条崩溃信息也有一个单独的UUID,用来和程序的UUID进行校对。这些UUID一致时才可以解析出当前APP的崩溃信息....5.崩溃main函数。这种情况最苦逼也是最难找到bug所在,这种情况下,用@try @catch将main函数包裹起来,这样抛出异常堆栈信息等,或者通过添加全局breakPoint来追踪bug。

2.7K10

iOS_Crash 异常类型

一些底层库(如 Dispatch)遇到不可恢复的错误时,捕获异常类型,并在 Additional Diagnostic Information 中记录有关该错误的附加信息。...内存访问问题 当程序以意外的方式使用内存时,导致内存访问问题的崩溃报告。这些报告的异常类型为 EXC_BAD_ACCESSEXC_BAD_ACCESS (SIGBUS) 。...配置错误 - 缺少框架 如果程序缺少必要框架崩溃,报告包含 EXC_CRASH (SIGABRT) 的 Exception Codes和 Termination Description 描述 dyld...例如:有项任务需要4s,允许的总挂钟时间为5s。当 watchdog 5s 后终止程序时,花费 4s 的代码不会出现在回溯中,因为它已经完成,但它几乎消耗掉了整个挂钟时间。...优化执行后台任务的代码以提供 CPU 效率,或减少程序在后台运行时执行的工作量以解决崩溃问题。

1.4K20

iOS你不知道的事--Crash分析

原文作者:Cooci和谐学习不急不躁 原文地址:https://www.jianshu.com/p/56f96167a6e9 大家平时开发过程中,经常会遇到Crash,那也是正常不过的事,但是作为一个优秀的...Crashes 对应的app,就是当前app最新一版本的crash log ,并且是解析过的,可以根据crash 栈 等相关信息 ,尤其是程序代码级别的 有超链接,一键可以直接跳转到程序崩溃的相关代码,...Exception Type: EXC_BAD_ACCESS (SIGSEGV) Exception Subtype: KERN_INVALID_ADDRESS at...因此,EXC_BAD_ACCESS (SIGSEGV)表示的意思是:Mach层的EXC_BAD_ACCESS异常,host层被转换成SIGSEGV信号投递到出错的线程。...signal 函数拦截不到的解决方式 debug模式下,如果你触发了崩溃,那么应用直接崩溃到主函数,断点都没用,此时没有任何log信息显示出来,如果你想看log信息的话,你需要在lldb中,拿SIGABRT

1.4K10

Xcode崩溃原因汇总

.: NSArray *testArr = @[@"1"]; NSLog(@"111 %ld",testArr.retainCount); [testArr release];...错误描述:EXC_BAD_ACCESS(不能访问该存储器区域) 解决方案:NSZombieEnabled e.g.: UIView *view = [UIView alloc]; [self.view...addSubview:view]; view只是分配了内存空间,并没有初始化,是僵尸对象,addSubview造成崩溃。...向对象发送未定义的消息 错误描述:unrecognized selector sent to instance 解决方案:调试控制台会打印对应的消息方法和错误描述,用异常断点能定位到具体代码行。...在这,不要忽略viewDidLoad就是主线程执行,同步线程加入到主线程形成死锁。程序直接崩溃。 内存泄漏 本不该放这,但是又不想重新写一篇只有几十个字的文章,暂且将就放这。

1.6K30

Objective-C中的集合类

一、数组         1.不可变的数组  NSArray             数组是有序对象的集合,用来存储对象的有序列表,OC中数组中必须存的是对象,不能是基本数据类型,若想存入基本数据类型...NSArray也是OC中的一个对象,使用NSArray也需要进行实例化,前面的博客类的初始化中提到了便利初始化函数和便利构造器,NSArray中也少不了这两样东西我们可以通过NSArray的便利初始化函数或者便利构造器进行...(1)NSArray的初始化                 NSArray的便利初始化函数: -(id) initWithObjects : (id) firstObject, ....;                 ...NSArray *array1 = [[NSArray alloc] initWithObjects:@"aaa", @"bbb", @"ccc", nil]; //NSArray的便利构造器 NSArray...的容量是固定的,NSMutableArray的容量是可变的,我们可以NSMutableArray实例化的时候先初始化一个容量,不过这个容量不是固定的,不够的时候自动增加。

1.1K70

【IOS开发基础系列 整理】IOS沙盒机制专题

因为应用的沙盒机制,应用只能在几个目录下读写文件         Documents:苹果建议将程序中建立的或在程序中浏览到的文件数据保存在该目录下,iTunes备份和恢复的时候包括目录         ...Library:存储程序的默认设置或其它状态信息;         Library/Caches:存放缓存文件,iTunes不会备份目录,目录下文件不会在应用退出删除         tmp:提供一个即时创建临时文件的地方...iTunes与iPhone同步时,备份所有的Documents和Library文件。iPhone重启时,丢弃所有的tmp文件。         ...docDir) {          NSLog(@"Documents 目录未找到"); }  NSArray *array = [[NSArray alloc] initWithObjects:@"...写入array ,里面是两个字符串,一我们读出来打印。

25530

id类型和instancetype类型

: NSObject @end 和下面的通用初始化代码NSArray *array = [[NSArray alloc] init]; 该表达式[NSArray alloc]是NSArray *...实际上,Apple对于这个主题是这么解释的: 在你的代码中,合适的地方用返回类型instancetype代替id类型。这通常出现在init方法和类的工厂方法。...举例来说,以前Mac OS下[[NSFileHandle fileHandleWithStandardOutput] writeData:formattedData]产生如下错误:Multiple...这也就是为什么很多人会说使用instancetype不是必须的。当然我认为你还是应该去这么写。下面会解释为什么: 这有三个好处: 明确性。你的代码的行为如同你写的那样,不是其他行为。 模式化。...最好的情况下而言,你学会忽略这两行的差别。但这并不是你应该学会忽略的,对你来说这两句应该是不一样的 模式化: 当然init方法和其他方法没有区别,但一旦你定义一个类工厂,那就有差别了。

1.8K10

RuntimeiOS开发中的实际应用

Masony的关联的对象 关于分类的介绍可以查看美团技术团队写的深入理解Objective-C:Category 1.1 为什么catagory 无法设置属性 struct objc_category...objc_removeAssociatedObjects(id object); (1)key值   关于前两个函数中的 key 值是我们需要重点关注的一个点,这个 key 值必须保证是一个对象级别(为什么是对象级别...textFiled setValue:placeholderLabel forKey:@"_placeholderLabel"]; 5 面向切面编程(AOP) 主要利用Method Swizzling 不破话原有的代码...程序猿是跳槽率偏高的职业,如果去新公司做新项目还好说,一旦需要接手老项目的维护,商业项目可不是我们平常写的Demo的代码量,那代码中的逻辑结构瞬间让新入职的小伙伴们懵逼,通过通过拦截点击事件,可以快速的熟悉代码的逻辑...(RBSafe_initWithObjects:count:)]; Class __NSArray = NSClassFromString(@"NSArray");

96820

Bugless 异常监控系统 (iOS端)

也无法多维度进行异常数据的对比,使得收集应用信息和收集崩溃日志变得日益迫切。 37手游研发的 Bugless 定位于从线上问题追踪的视角出发,检测代码异常,通过回溯问题,从而解决代码本身问题。...二、认识崩溃和异常 讲解 Bugless 之前,让我们从三个层面来介绍,让大家认识App为什么会出现崩溃和异常,以及如何应对。...常见的异常崩溃信息中,经常会看到有 Exception Type: EXC_BAD_ACCESS (SIGSEGV) 这样的字段和内容,EXC_BAD_ACCESS 和 SIGSEGV,分别是指 Mach...捕获异常方法如下: [获取崩溃异常的代码实现] 注册异常捕获函数 [注册异常捕获函数] 以下是捕获流程图: [异常捕获流程图] App 启动初始化后,判断是否开启异常监听...2.3.1 Bugless 上报闪退堆栈 从数据全量收集出发,获取闪退的日志时机有两个: 第一时机:闪退立即上报,但第一次可能因为进程被杀死发送不成功。

2.5K30

面经之《招聘一个靠谱的iOS》import CYLBlockExecutor.himport CYLBlockExecutor.himport CYLNSObject+RunAtDeallo

这个写法会出什么问题: @property (copy) NSMutableArray *array; 两个问题:1、添加,删除,修改数组内的元素的时候,程序因为找不到对应的方法崩溃.因为 copy...比如下面的代码就会发生崩溃 // .h文件 // 下面的代码就会发生崩溃 @property (nonatomic, copy) NSMutableArray *mutableArray; // ....与其setter中判断,为什么不把代码写好? 或者 [a setX:[a x]]; //队友咆哮道:你干嘛?!! 不要在 setter 里进行像 if(_obj !...如果a是由 assign 修饰的,则: b 非 nil 时,a 和 b 指向同一个内存地址, b 变 nil 时,a 还是指向该内存地址,变野指针。此时向 a 发送消息极易崩溃。...*array = [[NSArray alloc] initWithObjects:@"One", @"Two", @"Three", nil]; // For the purposes of illustration

980100

重构那些事(一)

用array()的形式有点啰嗦,就像OC中原来创建数组是如下形式 NSArray *arr = [[NSArray alloc] initWithObjects:@"1", @"2", nil]; 变成语法糖之后改用了如下方式...NSArray *arr = @[@"1", @"2", @"3"]; 是不是清爽了很多,既然新版本中引入了这种中括号的形式来创建数组,说明PHP是更建议使用这种格式来初始化数组的,何不与时俱进,一起改造成用中括号的形式来初始化数组呢...那么问题来了,现有的成千上万个array()这种形式创建数组的方式怎么办,两种办法 用正则表达式全局替换 这种方式最简单,一劳永逸 只新业务或重构中使用语法糖的形式 可能你担心这种批量替换会出什么问题...对此我是这么看的,一个优秀的程序员应该要有一些代码洁癖,要有写业务时顺便或者说之后重构代码的意识,这样不仅会给其他小伙伴留下非常良好的专业的印象,而且也方便之后的维护,套用iOS大拿喵神的话来说:”一个有节操的程序员会在乎自己的代码的不合理性...而且调用方法的方法有接近1900行!

29820

编码篇-Block里面的小天地

下图是block的数据结构定义,显而易见,Block_layout里,我们看到了isa指针,为什么说block是对象呢,原因就在于isa指针,objective-c语言的内部,每一个对象都有一个isa...并且苹果的 官方文档 中也提到,当把栈中的 block 返回时,不需要调用 copy 方法了。并且因为block是一段代码,即不可变。...Block的使用中很容易出现的问题 (1)一个类中有一个Block性质的属性,并且代码里面有用到,如果在对象初始化的时候,不做处理是崩溃的,这也是block不方便的地方,不像代理可以实现也可以不实现...(2)block中 alloc init一个变量 并且 push到这个对象中时是 崩溃的。 block 中引用一个对象。...block的代码是内联的,效率高于函数调用 block对于外部变量默认是只读属性 block被Objective-C看成是对象处理 小结 后续持续更新 本文参考文章 深入浅出-iOS Block原理和内存中位置

60820
领券