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. IllegalArgumentException: Does not contain a valid host:port authority: master:8031

    java.lang.IllegalArgumentException: Does not contain a valid host:port authority: master:8031 (confi ...

  2. libc.so.6 误删后修复

    libc.so.6 误删后修复  libc.so.6 被删除了(libc.so.6只是个链接,真实的lib 文件是 libc-2.15.so) su, sudo,ls, cp, mv 等等一系列命令都 ...

  3. Codeforces Round #316 (Div. 2)

    A. Elections time limit per test 1 second memory limit per test 256 megabytes input standard input o ...

  4. 数据结构(线段树):BZOJ 1568 [JSOI2008]Blue Mary开公司

    1568: [JSOI2008]Blue Mary开公司 Time Limit: 15 Sec  Memory Limit: 162 MBSubmit: 602  Solved: 214[Submit ...

  5. 后缀自动机(SAM)模板

    struct SAM{ ],fa[maxn],len[maxn],cnt,last; void Init() { memset(ch,,sizeof(ch)); memset(fa,,sizeof(f ...

  6. cf601A The Two Routes

    A. The Two Routes time limit per test 2 seconds memory limit per test 256 megabytes input standard i ...

  7. E - Find The Multiple

    题目大意 找倍数 给你一个数,找到一个能数是它的倍数的数,当然这个数只能由0和1组成.......这个数最大200,比较唬人,其实这个数在最大也不超过2^64.....简单广搜一下 ///////// ...

  8. FC和SCSI

    IDE(Integrated Drive Electronics)即"电子集成驱动器",它的本意是指把"硬盘控制器"与"盘体"集成在一起的硬 ...

  9. tcp dump 截取http

    监听命令 sudo tcpdump -w mm.txt -s 0 -A -v  tcp dst port 8080 -w mm.txt :把记录下来的数据已二进制格式存储在mm.txt文件内  -w ...

  10. 跨平台通信中间件thrift学习【Java版本】(转)

    转自:http://neoremind.com/2012/03/%E8%B7%A8%E5%B9%B3%E5%8F%B0%E9%80%9A%E4%BF%A1%E4%B8%AD%E9%97%B4%E4%B ...