使用相机时切入后台报错:Thread1:EXC_BAD_ACCESS(code=1,address=0x1)解决办法之一

博客讨论了在iOS应用中遇到的一个问题,当应用从活跃状态切到后台时,由于ARC导致Thread1: EXC_BAD_ACCESS(code=1,address=0x1)错误。作者指出,程序在后台时不执行disappear方法。通过参考第三方资源,建议采用监听应用状态变化的方式,手动调用disappear方法来解决这个问题。" 109696905,50230,AutoLisp应用管理平台:@lisp详解,"['lisp', '开发语言', 'AutoCAD插件']

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

问题是ARC错误release的对象再次被release。

程序切入后台时不会走disapear方法

参考了http://songzengbin.github.io后总结如下

加入监听监听切入后台或进入前台,手动执行disappear

在init中

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(enterBackgorund:) name:UIApplicationDidEnterBackgroundNotification object:nil];
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(enterForeground:) name:UIApplicationWillEnterForegroundNotification object:nil];

    #pragma mark application  enterBackgorund enterForeground
-(void)enterBackgorund:(NSNotification *)notif
{
[self viewWillDisappear:YES];
}

-(void)enterForeground:(NSNotification *)notif
{
[self viewWillAppear:YES];
}

- (void)viewWillAppear:(BOOL)animated
{
[self.mapView viewWillAppear];
self.isMapViewShowing = !self.mapView.hidden;
self.mapView.delegate = self; // 此处记得不用的时候需要置nil,否则影响内存的释放
}
- (void)viewWillDisappear:(BOOL)animated
{
[self.mapView viewWillDisappear];
self.isMapViewShowing = NO;
self.mapView.delegate = nil; // 不用时,置nil
}
在dealloc中
    [[NSNotificationCenter defaultCenter] removeObserver:self name:UIApplicationWillEnterForegroundNotification object:nil];
[[NSNotificationCenter defaultCenter] removeObserver:self name:UIApplicationDidEnterBackgroundNotification object:nil];

Thread 1exc_bad_accesscode=1address=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、付费专栏及课程。

余额充值