iOS开发中,因为大部分函数都不是线程安全的,所以UI子线程中操作UI是非常危险的事,但是有时候因为开发者经验不足,不知道子线程中不能UI,或者知道但是写代码的时候没注意,或者不知道那些函数操作UI了(比如UITableView的reload函数),造成这个问题时常发生,防不胜防,而且iOS不像安卓,一旦子线程中操作UI就直接崩溃,iOS中操作UI只是有可能崩,导致问题经常不好重现,而且经常奔溃堆栈是乱的,找不到出错的地方在哪儿,十分头疼。

  本人写了一个简单的线程检查ui操作的库,当子线程操作ui时,会根据宏定义crash(VIEW_OP_INSPECT_CRASH)或者打印堆栈(VIEW_OP_INSPECT_LOG_STACK)(两者不冲突),基本原理是利用用runtime的class_replaceMethod替换了uiview的大部分api(考虑到性能问题,get操作没有replace),然后在replace的函数中检查当前线程是否是主线程。

  github地址是https://github.com/pualxiao/PXViewOpInspect(刚刚写出来的一个库,不断完善中,轻拍。欢迎大家提出意见和建议,并参与到代码的完善中)

  使用方法很简单,将PXViewOpInspect.h和PXViewOpInspect.m放在工程中就可以了,如果定义了VIEW_OP_INSPECT_CRASH和VIEW_OP_INSPECT_LOG_STACK中的一个宏,就会去替换了uiview的api,否者就不会。

  考虑到性能问题,建议在debug模式下使用本库,release下不定义VIEW_OP_INSPECT_CRASH和VIEW_OP_INSPECT_LOG_STACK即可。

  

iOS子线程操作UI问题检查的更多相关文章

  1. iOS子线程操作检测版本更新,有新版本通知用户更新, CheckVersion

    iOS子线程操作检测版本更新,有新版本通知用户更新 CheckVersion 一:如何使用: #import "CheckVersion.h" //输入你的app在appStore ...

  2. Android开发——子线程操作UI的几种方法

    在Android项目中经常有碰到这样的问题,在子线程中完成耗时操作之后要更新UI,下面就自己经历的一些项目总结一下更新的方法: 在看方法之前需要了解一下Android中的消息机制. 转载请标明出处:h ...

  3. iOS子线程更新UI的两种方法

    http://blog.csdn.net/libaineu2004/article/details/45368427 方法1:performSelectorOnMainThread[self perf ...

  4. Android开发——子线程操作UI的几种方法(待续)

    方法2  Handler andler mHandler = new Handler() { @Override public void handleMessage(Message msg) { su ...

  5. 解决子线程操作UI的方法

  6. Android -- ViewRoot,关于子线程刷新UI

    Android在4.0之后执行线程更新UI操作会报异常:CalledFromWrongThreadException:Only the original thread that created a v ...

  7. Android子线程更新UI的方法总结

    版权声明:本文为博主原创文章,转载请注明出处:https://i.cnblogs.com/EditPosts.aspx?postid=6121280 消息机制,对于Android开发者来说,应该是非常 ...

  8. [Android学习笔记]子线程更新UI线程方法之Handler

    关于此笔记 不讨论: 1.不讨论Handler实现细节 2.不讨论android线程派发细节 讨论: 子线程如何简单的使用Handler更新UI 问题: android开发时,如何在子线程更新UI? ...

  9. 子线程更新UI界面的2种方法

    一.一般我们都会在子线程完成一些耗时的操作. 1.Android中消息机制: 2.知识点: Message:消息,其中包含了消息ID,消息处理对象以及处理的数据等,由MessageQueue统一列队, ...

随机推荐

  1. ubuntu删除openjdk,安装 Sun JDK

    1.到官网下载安装包: jdk-7-linux-i586.tar.gz 2.创建安装目录:sudo mkdir /usr/lib/jvm 3. 解压缩:tar zxvf ./jdk-7-linux-i ...

  2. Monthly Expense(二分)

    Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 11196   Accepted: 4587 Description Farm ...

  3. HDU4681 String(dp)

    题目链接. #include <iostream> #include <cstdio> #include <cstring> #include <cstdli ...

  4. phpMyAdmin 完整路径泄露漏洞2

    漏洞名称: phpMyAdmin 完整路径泄露漏洞 CNNVD编号: CNNVD-201307-651 发布时间: 2013-08-09 更新时间: 2013-08-09 危害等级: 中危   漏洞类 ...

  5. interview material

    Articles Recommended: Steve Yegge – Get That Job at Google [web] Carlos Bueno – Get That Job at Face ...

  6. 谈NOT IN和Exists

    表1: test001 select * from test001

  7. 11th day

    今天MySQL数据库的基本知识就学完了,明天开始做小项目什么的,有点小激动啊... <?php // 定义$sql语句执行函数 function my_query($sql){ $result ...

  8. DateTimePicker控件为空 分类: WinForm 2014-04-15 09:46 239人阅读 评论(0) 收藏

    设置属性:                 Format=Custom 加载事件:ValueChanged    private void dtpStart_ValueChanged(object s ...

  9. [置顶] Android JNI必须掌握的五点

      1:JNI是什么? Java NativeInterface(JNI)是Java提供的一个很重要的特性.它使得用诸如C/C++等语言编写的代码可以与运行于Java虚拟机(JVM)中的 Java代码 ...

  10. Qt Quick 事件处理之信号与槽

    前面两篇文章<QML 语言基础>和<Qt Quick 简单教程>中我们介绍了 QML 语言的基本的语法和 Qt Quick 的常见元素,亲们,通过这两篇文章,您应该已经能够完毕 ...