转自:http://www.cnblogs.com/ygm900/archive/2013/12/04/3457130.html
iOS 上不建议在非主线程进行UI操作,在非主线程进行UI操作有很大几率会导致程序崩溃,或者出现预期之外的效果。
我开始不知道这一点,在子线程中进行了弹窗操作,结果程序就出问题了!
报的错误是(EXC_BAD_ACCESS(code=2,address=0xcc),0x1a0ad32: movl 204(%ecx), %edx ),我以为是空指针导致的内存泄露,用了很多方法,但这问题感觉很顽固,困扰了我很多天。
后来有位大牛指点了我,问我是不是在子线程进行这个弹窗操作。。。直到此时我才明白问题出在哪里,问题顺利解决。有时候出现bug却不知道是哪引起的,这时是最纠结的,等明确了问题所在,问题就不是问题了。好了,言归正传。
那么在子线程中的UI操作如何处理呢?有两种方法:
一:在子线程,你需要进行的UI操作前添加dispatch_async函数,即可将代码块中的工作转回到主线程
dispatch_async(dispatch_get_main_queue(), ^{ //更新UI操作 //..... });
dispatch_async函数是异步操作,对于比较耗时的操作也可以这样处理:
dispatch_async(dispatch_get_global_queue(0, 0), ^{ // 处理耗时操作的代码块... //通知主线程刷新 dispatch_async(dispatch_get_main_queue(), ^{ //回调或者说是通知主线程刷新, }); });
dispatch_async开启一个异步操作,第一个参数是指定一个gcd队列,第二个参数是分配一个处理事物的程序块到该队列。
dispatch_get_global_queue(0, 0),指用了全局队列。
一般来说系统本身会有3个队列。
global_queue,current_queue,以及main_queue.
获取一个全局队列是接受两个参数,第一个是我分配的事物处理程序块队列优先级。分高低和默认,0为默认2为高,-2为低
二:performSelectorOnMainThread
performSelectorOnMainThread是指在主线程上执行某个方法,比如数据下载后,更新UI界面等操作
例如:在子线程中使用[self performSelectorOnMainThread:@selector(endThread) withObject:nil waitUntilDone:NO];
-(void)setupThread:(NSArray*)userInfor{ [NSThread detachNewThreadSelector:@selector(threadFunc:) toTarget:self withObject:(id)userInfor]; } - (void)threadFunc:(id)userInfor{ NSAutoreleasePool*pool = [[NSAutoreleasePool alloc] init]; //。。。。需要做的处理。 //这里线程结束后立即返回 [self performSelectorOnMainThread:@selector(endThread) withObject:nil waitUntilDone:NO]; [pool release]; }
performSelectorOnMainThread通知主线程执行函数endThread。
再次强调子线程内不要进行任何UI操作,不要刷新界面。如果需要进行这些操作,通过dispatch_async或performSelectorOnMainThread这两种方法,调出主线程中的方法去执行。
我就是遇到收起侧边栏时需要更改主窗口的按钮的图标,遇到崩溃。然后根据以上的资料,使用
dispatch_async(dispatch_get_main_queue(), ^{ //更新UI操作 //..... });
可以解决更改UI崩溃问题。
相关推荐
iOS开发,最郁闷的莫过于程序毫无征兆地就崩溃了,用bt命令打出调用栈,给出的是一堆系统EXC_BAD_ACCESS的信息,根本没办法定位问题出现在哪里。 首先说一下 EXC_BAD_ACCESS 这个错误,可以这么说,90%的错误来源...
在iOS开发中,EXC_BAD_ACCESS错误是一种常见的运行时错误,通常是因为程序尝试访问已被释放的内存地址导致的。当程序尝试访问一个已经释放的对象时,系统就会抛出EXC_BAD_ACCESS错误,这在C语言中通常被理解为使用了...
在软件开发过程中,特别是iOS应用开发中,经常会遇到难以捉摸的内存管理问题,其中最常见的之一就是`EXC_BAD_ACCESS`错误。这种类型的错误通常意味着应用程序尝试访问已释放或未分配的内存区域,这会导致程序崩溃。...
当出现 EXC_BAD_ACCESS 错误时,可以在终端中使用 `malloc_history` 命令来查看相关对象的内存分配历史记录。 - **命令格式**:`malloc_history ${App_PID} ${Object_instance_addr}` - **示例**:根据之前的...
标题中的“僵尸信号SIGABRT或EXC_BAD_ACCESS”是iOS开发中常见的错误类型,主要与内存管理和对象生命周期有关。这两个错误通常出现在Objective-C或Swift编程中,涉及到内存泄漏、过早释放对象或者试图访问已经释放的...
db2exc_975_WIN 数据库安装包,官网下载,亲测可用。 IBM DB2 是一套关系型数据库管理系统,DB2 Express - C
db2exc_970_LNX_x86_64.tar.gz Linux 64位系统 的db2 安装包。(第一部分)
db2exc_970_LNX_x86_64.tar.gz Linux 64位系统 的db2 安装包。(第二部分) 另一部分:https://download.csdn.net/download/qq_37570669/11260296
在实际调试程序的过程中,有时只获得异常的类型是远远不够的,还需要借助更详细的异常信息才能解决问题。 捕获异常时,有 2 种方式可获得更多的异常信息,分别是: 使用 sys 模块中的 exc_info 方法; 使用 ...
在IT行业中,电磁波的时域有限元分析是一项至关重要的技术,特别是在通信、天线设计、雷达系统和无线传输等领域。这个"code_file_exc_电磁波_"的压缩包文件很可能包含了一系列用于进行电磁波时域有限元分析的代码,...
重要信息2017年09月25日18:42:00 修复了在iOS11下必现EXC_BAD_INSTRUCTION (code=EXC_I386_INVOP, subcode=0x0)的崩溃BUG。已知bug提示:在替换模式LiveGiftAddModeReplace下使用animatedWithGiftModel方法将导致UI...
Mach异常可以是EXC_BAD_ACCESS(内存访问异常)等。Mach异常是通过Mach API暴露给用户态的,可以直接通过Mach API设置thread、task、host的异常端口来捕获Mach异常,抓取Crash事件。 二、Unix Signal Unix Signal...
CGImageIssueDemo 核心图形问题测试 做什么的 似乎对于iOS 11.2 +, CoreGraphics.framework发生了奇怪的... 这导致EXC_BAD_ACCESS KERN_INVALID_ADDRESS 0x0000000000000000 。 重现步骤 使用CGDataProviderCreateDi
- **异常类型**: 常见的奔溃原因有EXC_BAD_ACCESS(内存访问错误)、EXC_CRASH(程序异常终止)、SIGABRT(应用程序自己请求退出)等,分析这些异常类型可以帮助定位问题根源。 - **线程信息**: 奔溃日志中的线程...
1、tar -xzvf db2exc_nlpack_970_LNX_x86.tar.gz 得到文件夹nlpack 2、tar -xzvf v9.7_linuxia32_server.tar.gz 得到文件夹server 二、 语言包整合 cp -r nlpack/* ./server/ 三、 安装 1、cd server 2、sudo ./...
标题“inh-exc_neuron_oscillation_”暗示了我们正在探讨神经网络中抑制性与兴奋性神经元之间的交互,特别是关于它们如何引发振荡的现象。描述中的“excitatory neuron connection”进一步指出了兴奋性神经元间的...
出现EXC_BAD_ACCESS。 需要修改Product->Scheme->Edit Scheme->Options->GPU Frame Capture 选择 Disabled。 功能介绍 模仿Filckr的照相功能实现了: 1.实时滤镜 2.相机基本功能:拍照,对焦,前后...
在IT行业中,ADO(ActiveX Data Objects)是一种用于访问数据库的标准接口,由Microsoft开发并广泛应用于Windows环境。本文将深入探讨如何使用ADO编程模型将数据从数据库导出到Excel文件,以此来理解“将ADO数据转换...