[UIKeyboardLayoutStar release]: message sent to deallocated instance 0x15e6c3870

在iOS8 有键盘输入的地方, 从后台回到前台时会出现crash.
打印报错.

-[UIKeyboardLayoutStar release]: message sent to deallocated instance 0x15e6c3870

如果没有任何打印信息, 检查野指针和僵尸对象检测有没有打开. 打开方法:
edit scheme -> diagnostics -> Memory Management 勾选上 Malloc scribble和Zombie Object

报错原因

网上说是因为 对NSArray和NSDictionary的部分方法使用了交换方法.
亲自测试了一下, 当对NSMutableArray的objectAtIndex: 进行方法交换时, 才会出现crash.

解决办法

对NSMutableArray做方法交换, 原因是为了屏蔽向数组里添加nil时造成crash, 这个方法在工程中经常用到. 所以向网上说的把这个方法直接去掉改动太大. 最后在网上找到的解决办法是把这个类变成MRC模式
这里写图片描述

内部代码添加 @autoreleasepool{}

- (id)yb_objectAtIndex:(NSInteger)index
{
    @autoreleasepool{
        if (index < self.count) {
            return [self yb_objectAtIndex:index];
        } else {
            //        [NHCallStackSymbols callStackSymbols:self andObjectValue:[NSString stringWithFormat:@"NSMutableArray:%ld",index]];
            NSAssert(NO, @"数组越界了。。。。。。。");
            return nil;
        }
    }
}

后续

对于NSMutableArray, NSArray, NSMutableDictionary,NSDictionary 直接使用交换网上报了各种各样的雷, 现在更倾向于使用category给他们新增方法来做. 工程里的方法也会慢慢去掉.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值