摘要: 我的简书博客地址: http://www.jianshu.com/u/f2b6b692c983 阅读全文
posted @ 2017-03-01 13:52 杨淳引 阅读(143) 评论(0) 推荐(0) 编辑
摘要: 众所周知,当某个对象持有着一个Block的时候,如果在Block内部使用强引用反过来持有这个对象,就会导致引用循环。为了避免引用循环,可以使用__weak修饰符,苹果的官方文档在用代码演示__weak修饰符的时候,有这么一个例子: 那么,myController持有着completionHander 阅读全文
posted @ 2016-12-16 10:26 杨淳引 阅读(1799) 评论(0) 推荐(0) 编辑
摘要: 在公司的项目架构里,根控制器之后是4个一级功能页面,一级页面下再链接到各个其他功能页面上。 其中一级页面和其他功能页面的关系并不是固定的上下级关系,实际上它们之间的耦合度极低,甚至可以看做是完全平级、完全分割开的。 它们之间的链接关系其实是这样的:当在某一个功能页中要打开另一个功能页时,只需调用一个 阅读全文
posted @ 2016-12-15 17:42 杨淳引 阅读(183) 评论(0) 推荐(0) 编辑
摘要: 23、在前文中的例子中,Block结构体里的isa指针还没有详细讲解,这个指针都被置向了_NSConcreteStackBlock,它标识了Block的类型。 其实除了_NSConcreteStackBlock这个类型外,Block还有其他的类型,这些类型总共有3种: (1)、_NSConcrete 阅读全文
posted @ 2016-09-16 14:12 杨淳引 阅读(222) 评论(0) 推荐(0) 编辑
摘要: 11、那么Block到底是怎么实现的呢?试一试通过将Block 的代码转换成普通C语言代码来查看它的实现过程。 要将OC代码转换成C语言代码,可以使用clang编译的一个命令: 通过这个命令能把指定文件中的OC代码改写成C++代码(其中主要部分还是普通的C语言代码),通过这些代码就能看到Block是 阅读全文
posted @ 2016-09-16 13:59 杨淳引 阅读(506) 评论(2) 推荐(1) 编辑
摘要: 1、Block 本质上是一个struct结构体,在这个结构体中,最重要的成员是一个函数(当然除函数外还有其他重要的成员)。 2、在开始解析Block之前,首先来回顾一下Block的格式。Block相关的格式有2个: (1)、Block对象的格式; (2)、Block变量的格式; 3、对于Block对 阅读全文
posted @ 2016-09-16 00:49 杨淳引 阅读(192) 评论(0) 推荐(0) 编辑
摘要: 49、在上文5(1)中提到:当NSObject对象的retainCount减为0之后,就不要再去打印它的retainCount了,有可能导致crash。 为了验证这个说法,可以通过初始化一个对象并释放它,然后多次打印这个对象的retainCount来测试。 测试结果有很多种情况,取3种情况展示如下: 阅读全文
posted @ 2016-08-18 16:04 杨淳引 阅读(208) 评论(0) 推荐(0) 编辑
摘要: 41、在讨论property和内存管理相关的内容前,先回顾一下什么是property: (1)、首先,如果一个类没有定义property,能否访问它的实例变量?使用以下代码来验证一下。 建立一个类ShYBook,类内只有一个实例变量pageCount,如下: 使用“->”运算符来访问到它的实例变量, 阅读全文
posted @ 2016-08-18 15:57 杨淳引 阅读(171) 评论(0) 推荐(0) 编辑
摘要: 30、有时候你可能需要用到一些Core Foundation对象(比如CFArrayRef或者CFMutableDictionaryRef),对于这些对象,编译器是不会自动管理它们的生命周期的,你需要使用CFRetain或CFRelease之类的方法来管理它们的持有情况(ownership)。 如果 阅读全文
posted @ 2016-08-18 15:00 杨淳引 阅读(282) 评论(0) 推荐(0) 编辑
摘要: 6、ARC仍然遵循MRC的内存管理方式,4个基本规则在ARC下仍然是有效的,区别只在于:MRC模式下需要手动键入retain、release等方法来遵循这些规则,ARC环境下则是编译器自动在适当位置插入retain、release等方法去遵循这些管理规则,你不再需要去调用retain、release 阅读全文
posted @ 2016-08-18 14:43 杨淳引 阅读(157) 评论(0) 推荐(0) 编辑