[iOS崩溃]App键盘弹出后进入后台crash

问题

全局替换NSArray,NSMutableArray,NSDictionary,NSMutableDictionary等集合的方法(比如objectAtIndex:,addObject:,setObject:forKey:等等)去去获取一些安全性时(避免添加nil到数组,或者nil成为字典的key,value等情况)。

也会带来一个问题,在ARC编译环境下:

App弹出键盘后,进入后台,会crash

堆栈在:

Thread : Crashed: com.apple.main-thread
0  libobjc.A.dylib                6806634868 objc_release + 20
1  libsystem_blocks.dylib         6813456656 _Block_release + 256
2  libobjc.A.dylib                6806640420 (anonymous namespace)::AutoreleasePoolPage::pop(void*) + 564
3  CoreFoundation                 6529519172 _CFAutoreleasePoolPop + 28
4  UIKit                          6605817924 _wrapRunLoopWithAutoreleasePoolHandler + 76
5  CoreFoundation                 6530394704 __CFRUNLOOP_IS_CALLING_OUT_TO_AN_OBSERVER_CALLBACK_FUNCTION__ + 32
6  CoreFoundation                 6530382300 __CFRunLoopDoObservers + 360
7  CoreFoundation                 6530383292 __CFRunLoopRun + 836
8  CoreFoundation                 6529519780 CFRunLoopRunSpecific + 396
9  GraphicsServices               6682260900 GSEventRunModal + 168
10 UIKit                          6606283712 UIApplicationMain + 1488
11 Spec                           4297532060 main (main.m:15)
12 libdyld.dylib                  6813280776 start + 4

打开 Enable Zombie Objects,可以看到崩溃时控制台有输出:

-[UIKeyboardLayoutStar release]: message sent to deallocated

这里谨慎的怀疑是相关操作去release了NSArray或者NSMutableArray对象,但是在我们全局替换那些方法时,是使用了ARC编译的,是不需要手动release的,可能这就造成了多次release.

解决办法

  1. 最直接简单的是去掉这些集合的方法swizzle,但这样会失去原来想要得到的特性
  2. 设置这些实现文件的编译选项为-fno-objc-arc
相关参考

一个奇怪的Crash [UIKeyboardLayoutStar release]

stackoverflow 上的一个相关问题

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值