格而知之4:寻找EXC_BAD_ACCESS】的更多相关文章

EXC_BAD_ACCESS算是一个比较常见的错误,大部分情况下,它出现在某个对象还未初始化或已被释放后,还去试图访问这个对象的时候,即是在出现悬挂指针的时候(当然也有非悬挂指针导致的EXC_BAD_ACCESS).在MRC机制下,EXC_BAD_ACCESS相对会出现得比较多,毕竟手动管理引用计数比较可能会数错. 在ARC机制下就出现得比较少了,我自己就遇到过几次,可惜基本都忘了记下来,今天就准备试一试如何制造出一个EXC_BAD_ACCESS. 1.首先考虑到悬挂指针.悬挂指针的出现有两种可…
最近准备做一个随手笔记类的app给自己用,考虑到从未使用过Core Data,就决定用Core Data来做数据存储.在网上参考了一些Core Data的资料后,用一天的时间写了这个demo,主要测试了增删改查,以及排序和分页这些基本功能. demo的代码可以在GitHub上下载: https://github.com/ShayneYeorg/Core-Data-Sample 1.大致上,Core Data即是将数据库内容封装成了类和对象: (1).一个数据库实例对应一个NSManagedObj…
23.在前文中的例子中,Block结构体里的isa指针还没有详细讲解,这个指针都被置向了_NSConcreteStackBlock,它标识了Block的类型. 其实除了_NSConcreteStackBlock这个类型外,Block还有其他的类型,这些类型总共有3种: (1)._NSConcreteStackBlock (2)._NSConcreteMallocBlock (3)._NSConcreteGlobalBlock 24.这3种类型分别表示了Block对象存储的区域,如下图: 25.编…
11.那么Block到底是怎么实现的呢?试一试通过将Block 的代码转换成普通C语言代码来查看它的实现过程. 要将OC代码转换成C语言代码,可以使用clang编译的一个命令: 通过这个命令能把指定文件中的OC代码改写成C++代码(其中主要部分还是普通的C语言代码),通过这些代码就能看到Block是如何使用C++语言实现的. 12.首先编写一个最简单的Block,没有返回值和参数列表,执行它会输出“Shayne Yeorg”.代码如下: 然后使用11的命令转换这个文件,可以得到文件main.cp…
1.Block 本质上是一个struct结构体,在这个结构体中,最重要的成员是一个函数(当然除函数外还有其他重要的成员). 2.在开始解析Block之前,首先来回顾一下Block的格式.Block相关的格式有2个: (1).Block对象的格式: (2).Block变量的格式: 3.对于Block对象,它有几种常见的格式: (1).一个完整的Block对象的格式如下: 比如这个Block对象: 可以发现,完整的Block对象和函数的定义非常相似,比如这个函数: 两者之间的区别仅仅是:Block对…
1.最近在重读当年刚开始学习多线程时的笔记,发觉其中有一些地方还是比较容易模糊,于是整理这篇笔记记录一下. 执行方式和队列 2.队列用来存放管理要执行的任务,它分为并发队列(Concurrent Dispatch Queue)和串行队列(Serial Dispatch Queue): 并发队列:队列内的任务允许被分配给多条线程同时执行: 串行队列:队列内的任务只能被放在一条线程内顺序执行. 3.执行方式分为异步(Asynchronization)和同步(Synchronization): 异步:…
关联对象 14.使用Category对类进行拓展的时候,只能添加方法,而不适合添加属性(可以添加属性,也可以正常使用get方法和set方法,只是不会自动生成以下划线开头命名的成员变量). 可以通过关联对象(Associated Objects)来在Category里添加一个关联对象,然后将这个对象当做属性来看待使用,制造出“在Category中添加属性”的效果. (1).假设要在NSObject类的Category中添加一个关联对象,处理方法如下: 首先在@interface里照常添加属性ass…
消息发送(Messaging) 8.以上便是runtime相关的一些数据结构,接下来我们回看一开始的疑问: objc_msgSend()函数在执行的过程中是如何找到对应的类,找到对应的方法实现的呢? 这就是消息发送(messaging)的处理过程了: (1).对于上文的Class的数据结构的描述,官方文档只简略了把它们归纳成了两部分:一个指向其父类的指针和一个方法调用表(这个Class的所有方法的selector和实现代码所在地址的关联表): (2).当某个消息被发送到一个对象之后(即对象执行某…
基本简介 1.根据官方文档,OC有一个特性:它会尽可能把一些决定从编译时和链接时推迟到运行时才处理,所以这门语言需要的就不只是一个编译器,它还需要一个runtime系统来处理那些已经被编译过的代码. 2.runtime有两种:legacy runtime和modern runtime,区别在于: (1).在legacy runtime中,如果你修改了一个类的实例变量之后,你需要重新编译一下: (2).在modern runtime中,在这种情况下你无需再重新编译一次. 3.OC的程序和runti…
1.什么是Run Loop? (1).Run Loop是线程的一项基础配备,它的主要作用是来让某一条线程在有任务的时候工作.没有任务的时候休眠. (2).线程和 Run Loop 之间的关系是一一对应的,但是并不是说新开一条线程就会自动生成这条线程对应的Run Loop,每一条线程里的Run Loop都是需要主动去获取,并且启动它,它才会开始运作的.主线程的Run Loop之所以不用我们手动去获取启动它,是因为在App启动的时候它已经默认启动了. (3).Run Loop的核心是__CFRunL…