runtime MethodSwizzle 实践之 奇怪crash : [UIKeyboardLayoutStar release]: message sent to deallocated instance

情景: 使用MethodSwizzle 实现对数组、字典 等系统方法的安全校验。显然能达到预期效果,但实际发现当

键盘显示的情况下  home app 进入后台,再单击app  图标 切换回前台时 发生crash :

[UIKeyboardLayoutStar release]: message sent to deallocated instance

UIKeyboardLayoutStar 是键盘上的布局的视图吧,

整个工程都在ARC下 构建,很奇怪,而且必须。

信息:

http://huang.sh/2015/02/%E4%B8%80%E4%B8%AA%E5%A5%87%E6%80%AA%E7%9A%84crash-uikeyboardlayoutstar-release/

http://code4app.com/ios/DurexKit%E5%AE%89%E5%85%A8%E5%B7%A5%E5%85%B7%E5%8C%85/5325b421933bf0463d8b49ec

其中都有提到DurexKit  原理都是一样的,上面提到原因是替换了 NSArray的objectAtIndex: 方法,

不过在我的项目原因是替换了NSMutableArray 的objectAtIndex:( NSMutableArray和 NSArray 的objectAtIndex:都有替换,单独替换 NSArray 的objectAtIndex:方法则不会引起crash)

解决方案:给 添加非ARC 支持,并改写实现

有提到:。。貌似 arc 有时也不一定可靠。

时间: 2024-11-08 17:21:30

runtime MethodSwizzle 实践之 奇怪crash : [UIKeyboardLayoutStar release]: message sent to deallocated instance的相关文章

-[UIKeyboardLayoutStar release]: message sent to deallocated instance

网上大家都说是因为替换了系统的objextAtIndex方法,但是为了减少应用崩溃的可能,是要进行Hook的,所以不想取消Hook. 解决办法,关掉键盘进入后台. - (void)applicationWillResignActive:(UIApplication *)application { [[UIApplication sharedApplication].keyWindow endEditing:YES]; }

iOS [UIKeyboardLayoutStar release]: message sent to deallocated

使用MethodSwizzle 实现对数组.字典 等系统方法的安全校验.显然能达到预期效果,但实际发现当键盘显示的情况下  home app 进入后台,再单击app  图标 切换回前台时 发生crash : [UIKeyboardLayoutStar release]: message sent to deallocated instance UIKeyboardLayoutStar 是键盘上的布局的视图吧, 整个工程都在ARC下 构建,很奇怪 其中都有提到DurexKit  原理都是一样的,上

runtime MethodSwizzle 实践之扩展 NIAttributedLabel

runtime MethodeSwizzle 提供 简单的方法交换已知类的  Method IMP. Method 可以是 外部可访问的 public 或者 private Method .所谓的属性或私有变量 也不过是 getter/setter Method 而已. MethodeSwizzle 技术 几乎可以实现你要使用 已知类的所有东西. so Powerful. 代码实现: #import <Foundation/Foundation.h> @interface NSObject (

CRASH: -[NSNull length]: unrecognized selector sent to instance错误的处理办法

开发中从后台请求数据,返回如下: 2014-12-05 16:44:52.535 掌麦[6984:613] getDefaultAddress: reuslt == { item =     { data =         { address = "<null>"; area = "<null>"; city = "<null>"; name = ""; phone = 185030513

iOS runtime实用篇解决常见Crash

程序崩溃经历 其实在很早之前就想写这篇文章了,一直拖到现在. 程序崩溃经历1 我们公司做的是股票软件,但集成的是第三方的静态库(我们公司和第三方公司合作,他们提供股票的服务,我们付钱).平时开发测试的时候好好的,结果上线几天发现有崩溃的问题,其实责任大部分在我身上. 我的责任: 过分信赖文档,没进行容错处理,也就是没有对数据进行相应的判断处理. 下面附上代码,说明崩溃的原因 因第三方公司提供的数据错乱导致有时候创建字典的时候个别value为nil才导致的崩溃 //宏#define CString

Runtime的实践——给一个类添加属性(关联对象)

相关文章: <Runtime的初步认识--结构体与类> <Runtime的初步认识--消息机制> 一提到给一个类添加点什么,我们有可能首先就想到类别(Category).那么我们就弄一下. 利用 Category 给现有的类添加属性 比如我们要给一个 NSArray 添加一个属性叫做NSString *name. 我们首先新建一个Objective-C文件. File: Name File Type:Category Class:NSArray 然后我们在NSArray+Name.

iOS 修改通讯录联系人地址(address)崩溃原因分析

目前项目中需要对iOS系统通讯录进行读取,修改操作.在进行对地址修改的时候,出现了一个奇怪现象: ● 如果contact没有address字段(或者一个全新的contact),对它的address进行修改是可以成功的, ● 如果这个人有过address字段,此时对它就行修改就崩溃.控制台打出: *** -[CFString release]: message sent to deallocated instance 0x81d26f0 这应该是一个僵尸对象,重复释放某一个对象.首先我对修改通讯录

Xcode开发技巧——调试

断点(Breakpoint)断点是调试中非常重要的一个手段.由于在执行到某些代码前需要执行许多其它代码,不可能用单步跟踪一条一条执行过来,这时只要在需要暂停的地方设置一个断点,然后让程序运行,当执行到这个断点位置时不需要用户干预就会暂停并返回集成调试程序.断点必须位于可执行代码行上,凡设置在注释,空白行,变量说明上的都是无效的. 一.概述 1.掌握调试技巧,调试技术 最基本,最重要的调试手段包括:单步跟踪,断点,变量观察等. 单步跟踪(Step)所谓单步跟踪是指一行一行地执行程序,每执行一行语句

XCode 4 的调试定位技巧

给跪了,相当好用: http://superwanc.diandian.com/post/2013-09-12/40052870537 经常有朋友会问Crash的问题.Crash最多的无非就两种,一种就是signal SIGABRT,大概的意思就是发送Message出现问题,信号迷失了.这种的Crash其实是很好定位,Crash了后直接看Console里出的最后日志,比如这段: 2012-03-28 19:26:33.055 TableViewMenuDemo[3916:f803] *** Te