
OC阅读笔记
FireKeyboard
这个作者很懒,什么都没留下…
展开
-
OC阅读笔记六:NSCopying协议
若想让自己的类支持拷贝,则必须实现NSCopying协议.该协议只有一个方法:-(id)copyWithZone:(NSZone*)zone 如果自定义的对象分可变与不可变版本,需同时实现NSCopying和NSMutableCopying协议 拷贝可变的属性时,应该拷贝它的实例变量, 无论当前拷贝的对象是否可变,copy取得的都是不可变版本,而mutableCopy原创 2016-03-29 23:03:47 · 364 阅读 · 0 评论 -
OC阅读笔记十六:保留环
几个对象互相引用形成环,当无其他对象引用环中的对象时,就会造成内存泄露.保留环可以通过弱引用声明”非拥有关系"来避免. unsafe_unretained修饰的对象,在调用方法时,若是对象被回收,可能会使应用崩溃. weak修饰的对象,在对象被回收后,就会自动将属性值设为nil.这么做导致数据错误比起对象被回收应用崩溃体验上要来得好原创 2016-04-10 22:26:12 · 299 阅读 · 0 评论 -
OC阅读笔记十五:"异常安全代码"的内存管理
在使用Objective-C++编码时,或者使用第三方库时抛出不受控制的异常的情况下,需要捕获和处理异常. 在MRC下,捕获异常后可以在@finally里释放try块里创建的对象. 在ARC下,由于生成安全处理异常的附加代码会导致应用程序变大,降低运行效率等问题,需要时必须手动开启-fobjc-arc-exceptions标志来使用该附加代码.并且当OC里抛出异常时应用已经终止原创 2016-04-10 22:23:30 · 343 阅读 · 0 评论 -
OC阅读笔记五:异常机制
在ARC环境下发生异常,可能导致作用域末尾释放的对象得不到自动释放.如果想要"异常安全",则需要设置"-fobjc-arc-exceptions"编译器标志. Objective-C当前只有在极为严重的情况下抛出异常,并且退出应用,不考虑恢复问题. 一般非致命错误时,通常是返回nil/0,或者使用NSError. NSError对象内封装了三条信息,domain(错误原创 2016-03-28 22:10:07 · 300 阅读 · 0 评论 -
OC阅读笔记四:消息转发
在消息转发的过程中,可以告诉对象如何处理无法解读的未知消息. 消息转发分两大阶段,第一阶段为"动态方法解析",就是判断接收者所属的类能否动态添加方法处理未知消息.若使用该方法,需实现相关的代码.通常用来实现@dynamic属性. 第二阶段第一步,如果第一阶段返回NO,则会查看接收者内部其他对象是否能够处理未知的选择子,如果可以便返回该对象,否则进入下一步. 第二阶段第原创 2016-03-27 23:26:40 · 280 阅读 · 0 评论 -
OC阅读笔记十九:禁用retainCount
在ARC中,使用retainCount会报错,此方法已经被正式废弃.即使在MRC中,也不要使用retainCount. retain只能返回某个时间点上的引用计数,但是我们并不知道该对象是否已经添加到自动释放池中,使用retaincount 反而会误导开发者错误判断对象的引用计数值. 系统会尽可能的将NSString实现成单例对象,如果字符串是个编译期常量,那么编译器会将NSS原创 2016-04-12 22:27:27 · 451 阅读 · 0 评论 -
OC阅读笔记三:动态绑定
Objective-C通过向对象发送消息来调用方法,其核心函数为objc_msgSend. objc_msgSend的参数分三部分:对象为接收者,方法名为选择器,以及消息中的参数. 每个类中都有个方法列表,由选择器作为key,方法实现作为值.objc_msgSend通过查询方法列表来获取具体的实现代码. 方法列表里的选择器与其对应的方法可以在运行时修改. 每原创 2016-03-27 00:01:32 · 328 阅读 · 0 评论 -
OC阅读笔记十八:僵尸对象(Zombie Object)
在捕捉向已回收对象发送消息的异常时,可使用僵尸对象.若要使用僵尸对象,则要在Scheme->run中勾选"Enable Zombie Objects". 若开启僵尸对象,在回收对象时,会将该对象转化为僵尸对象.即将回收对象的isa指针指向特殊的僵尸对象,该僵尸对象是_NSZombie_的拷贝. 僵尸类能响应所有的选择子. 在消息转发机制的___forwarding__原创 2016-04-11 23:30:11 · 1208 阅读 · 0 评论 -
OC阅读笔记一:尽量使用不可变对象
当将可变对象放入collection又修改值时,容易破坏set的内部数据结构,令其失去固有的语义; 将属性声明为readonly后,当试图改变属性值时编译器就会报错.保证开发时对象的底层数据不会改变,对象本身的数据结构也就不可能出现不一致的现象. 在对象内部"class-continuation分类"可以将属性重新声明为readwrite. 如要修改属性值,应该通过该原创 2016-03-24 22:24:14 · 360 阅读 · 0 评论 -
OC阅读笔记二:命名规范,避免冲突
由于Apple保留两字母前缀,当选择前缀时最好从三字母开始. 不仅仅是类名,应用程序中的所有名称都应该加前缀,包括分类和分类的方法. 前缀不仅能避免冲突,在栈回溯信息中,也能起到定位的作用. 如果要发布供其他人使用的代码,并在其中引入了第三方库AAA,需要给AAA加上前缀.避免使用者导入的其它第三方库里包含了相同的内容冲突,否则程序会造成重复符号错误. 当使原创 2016-03-25 23:16:44 · 452 阅读 · 0 评论 -
OC阅读笔记十四:dealloc
在dealloc方法里只应该释放所有对象并解除订阅的KVO和通知,不要有多余的操作. 如果对象拥有一些开销大或者系统内稀缺的资源,那么等到dealloc方法再释放是不适合的.通常是实现另一个清理对象的方法,在使用完这些资源后就调用该方法清理资源. 如果在dealloc里调用其他方法容易导致各种应用崩溃的问题,比如异步方法执行后,要回调对象时,对象已经被摧毁了,那么回调操作就好出原创 2016-04-07 00:42:16 · 397 阅读 · 0 评论 -
OC阅读笔记十三:ARC(下)
在方法中返回自动释放对象的时候,会调用objc_autoreleaseReturnValue函数检测返回的对象是否执行retain操作,如果执行就设置全局数据结构的一个标志位.而不执行autorelease操作. 与之相似,如果调用方法的代码要保留此对象,则调用objc_retainAutoreleasedReturnValue函数,检测刚刚的标志位,若已经置位,则不执行retain操作原创 2016-04-06 00:34:57 · 354 阅读 · 0 评论 -
OC阅读笔记十二:ARC(上)
ARC的功能都是基于核心的内存管理语义构建的. 在ARC中调用 retain,release,autorelease,dealloc方法都会报错,因为这会干扰ARC自动管理工作的进行. 并且在ARC调用这些方法时,并不是通过object-C的消息派发机制.而是通过直接调用其底层的C语言版本.比如retain方法的等价底层函数 objc_retain.这么做对于频繁执行的保留释放原创 2016-04-05 00:26:48 · 337 阅读 · 0 评论 -
OC阅读笔记十一:引用计数
对象如果存活,就说明正被其他对象拥有.从引用关系不断向下挖掘,会发现一个"根对象". 每个应用都有根对象(root object),在Mac OS X 应用中是NSApplication对象,iOS 应用中是UIApplication对象,两者都是应用程序启动时创建的单例. 当对象引用计数归零被回收时,系统会将内存标记可重用"reuse"放入可用内存池,但并不意味着对象不可用.原创 2016-04-04 01:54:56 · 340 阅读 · 0 评论 -
OC阅读笔记九:分类(下)
除了"class-continuation"之外的分类定义属性都无法向类中新增实例变量. 如果必要,可以用@dynamic声明,然后使用消息转发机制在运行期拦截方法调用,提供实现方法. 关联对象能解决分类不能合成实例变量的问题,但容易在内存管理问题上出错. 一般最好的作法是将所有属性都定义在主接口. 在"class-continuation"分类里可以隐藏实原创 2016-04-02 00:31:44 · 251 阅读 · 0 评论 -
OC阅读笔记八:分类(上)
将类里的方法根据功能分类,便于管理和调试. 例如某些私有方法,可以放在名为private的分类中,这样即使是其他使用者看到回溯信息时,也能理解方法的用途.这算是一种编写"自我描述式代码(self-documenting code)"的办法. 定义分类和方法时,应该加上程序或者库一致使用的前缀,这样能有效避免与其他分类重名. 分类重名并不会造成错误,但是后加载的分类会覆原创 2016-03-31 23:19:00 · 251 阅读 · 0 评论 -
OC阅读笔记七:委托数据源与协议
存放委托对象的属性(delegate)要用weak定义,因为可能委托的对象也持有本对象.二者之间必须为"非拥有关系".避免保留环造成内存泄露. 根据需求可以选择用weak或unsafe_unretained来定义delegate. 委托方法即可以传递参数给委托对象,也能获取委托对象的返回值. 委托协议一般用可选的(optional)标注,在调用委托方法前,必须先确定委原创 2016-03-30 22:45:05 · 385 阅读 · 0 评论 -
OC阅读笔记十:匿名对象
协议可以在某种程度上提供匿名类型,当接口背后有多个不同的实现类,又不想声明指定哪个类时,可以使用这种方法.因为有时候这些类会变,有时候又无法容纳于标准的类继承体系中,不能以某个公共基类来统一标示. 在一些情况下,对象的类型并不重要,重要的是对象有没有实现某些方法,可以用"匿名类型"来表达该概念. 在开发后续版本时,如果之前使用了"匿名对象"概念,则无需改变公有API,即可切换实原创 2016-04-02 23:03:57 · 321 阅读 · 0 评论 -
OC阅读笔记十七: "autorelease pool"降低内存峰值
在可能进行多次循环的情况下,或者循环中使用了开销大的对象时,等待循环结束再去释放循环中临时创建的对象,会导致内存峰值过高. 并非每个循环都要使用autoreleasepool来优化,在确认其内存用量前,不要建立多余的自动释放池,尽管自动释放池的开销并不大,但还是有的. 自动释放池排布在栈中,收到autorelease消息后,会将对象放入栈顶的池里 @autorelea原创 2016-04-10 22:31:24 · 431 阅读 · 0 评论