exc_bad access code=exc_1386_gpflt

iOS开发中经常遇到这样的一个bug:exc_bad access code=exc_1386_gpflt。

这样bug通常情况下就是内存管理方面的问题。

一般是访问了已经释放的对象导致的,可以开启僵尸对象(Zombie Objects)来定位问题:

Xcode的菜单:

Product->Scheme->Edit Scheme->Run xxx.app

右边的选项中,选中Enable Zombie Objects

开启该选项后,程序在运行时,如果访问了已经释放的对象,则会给出较准确的定位信息,可以帮助确定问题所在。

该功能的原理是,在对象释放(retainCount0)时,使用一个内置的Zombie对象,替代原来被释放的对象。无论向该对象发送什么消息(函数调用),都会触发异常,抛出调试信息。


记得在问题被修复后,关闭该功能




Thread 1:exc_bad_accesscode=1,address=0xffc)是一个常见的错误,通常出现在iOS开发中。这个错误表示程序试图访问一个已经被释放或无效的内存地址,导致程序崩溃。以下是一些可能的原因和解决方法: ### 可能的原因 1. **访问已释放的对象**: - 这种情况通常发生在对象被释放后,仍然有指针指向它,导致程序试图访问这个无效的内存地址。 2. **野指针**: - 野指针是指指向一个已释放或无效内存的指针。使用野指针会导致程序崩溃。 3. **内存管理问题**: - 在手动管理内存的情况下,忘记释放对象或多次释放同一个对象都会导致内存错误。 4. **循环引用**: - 对象之间的循环引用会导致内存无法被正确释放,从而引发内存错误。 ### 解决方法 1. **使用Xcode的Zombie Objects**: - 在Xcode中启用Zombie Objects可以帮助你检测访问已释放对象的情况。打开方法:Product -> Scheme -> Edit Scheme -> Run -> Diagnostics -> Enable Zombie Objects。 2. **使用Instruments工具**: - 使用Instruments中的Leaks和Allocations工具可以帮助你检测内存泄漏和野指针。 3. **避免循环引用**: - 使用弱引用(weak)或无主引用(unowned)来避免循环引用。 4. **检查内存管理**: - 确保每个对象的内存管理正确,避免内存泄漏和多次释放。 ### 示例代码 ```swift class Person { var name: String weak var partner: Person? // 使用弱引用避免循环引用 init(name: String) { self.name = name } deinit { print("\(name) is being deinitialized") } } var john: Person? = Person(name: "John") var jane: Person? = Person(name: "Jane") john?.partner = jane jane?.partner = john john = nil jane = nil ``` 在这个示例中,`partner`属性被声明为`weak`,从而避免了循环引用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值