zoukankan      html  css  js  c++  java
  • Effective Objective-C 2.0读书笔记(三)

    第13条,用“方法调配技术”调试“黑盒方法”(重点)

    • 运行期与选择子(selector)相匹配的方法(IMP)也是能改变的,这使得不用通过源代码或继承子类覆写方法就能改变类本身功能。
    • IMP是指函数的指针。
    • 选择子可以和IMP之间动态连接。
    • 使用另一份实现来替换原有的方法实现,这个过程叫“方法调配”。开发者可以用“方法调配”技术向原有实现添加新功能(热更新、动态替换原有方法、逆向破解)。
    • 一般在调试程序的时候在运行期修改方法实现,也有滥用导致的安全问题。

    关键词:method swizzling方法调配、IMP

    第14条,理解“类对象”的用意

    • 特殊类型id能够指代任意OC的对象类型,好处就是告诉编译器不用检测类型也能响应。
    • 运行期检视对象类型称之为:类型信息查询。
    • 每个OC对象实例都是指向某块内存数据的指针。
    • 每个实例都有一个指向Class对象的指针,用来表明其类型,这些Class对象构成了类的继承体系。
    • 如果对象类型无法在编译期确定,那么就应该使用类型信息查询方法来探知。
    • 尽量使用类型信息查询方法来确定对象类型,而不要直接比较类对象,因为某些类对象可能实现了消息转发功能。

    关键词:类型信息查询、isa、类对象

    第15条,用前缀避免命名空间冲突

    • 同一个项目中,多人共用相同模块;开源社区中,第三方组建库。防止空间冲突,引入前缀概念。
    • 前缀可以和公司、应用程序相关联,最好是三个及以上字母组成。
    • 自己开发的程序库中用到了第三方库,应为其中的名称加上前缀。

    关键词:命名空间冲突、前缀

     第16条,提供“全能初始化方法”

    • 可为对象提供必要信息以便其能完成工作的初始化方法叫做“全能初始化方法”。
    • 在类中提供一个全能初始化方法,并在文档中指明。
    • 若全能初始化方法与超类不同,则需覆写超类中的对应方法。
    • 如果超类的初始化方法不适用于子类,那么应该覆写这个超类方法,并在其中抛出异常。

    关键词:全能初始化方法

     第17条,实现 description 方法

    • 在新实现的description方法中,打印出类的名字和指针地址,有助于调试。
    • 实现description方法返回一个有意义的字符串,用以描述该实例。
    • 若想在调试时打印出更详尽的对象描述信息,则应该实现debugDescription。

    关键词:description、日志打印

    第18条,尽量使用不可变对象

    • 尽量把对外公布出来的属性设置为只读,且在确实有必要的时候才公布。
    • 若某属性仅可于对象内部修改,则在“class-continuation分类”中将其由readonly属性拓展为readwrite属性。
    • 不要把可变的collection作为属性公开,而应该提供相关的方法,以此修改对象中的可变collection。

    关键词:不可变对象、属性

  • 相关阅读:
    [CSP-S模拟测试]:Merchant(二分答案)
    [CSP-S模拟测试]:回文(hash+二维前缀和)
    [CSP-S模拟测试]:排列组合(数学 or 找规律)
    [CSP-S模拟测试]:X国的军队(贪心)
    BZOJ3714 [PA2014]Kuglarz 【最小生成树】
    BZOJ3922 Karin的弹幕 【线段树】
    BZOJ3495 PA2010 Riddle 【2-sat】
    BZOJ2597 [Wc2007]剪刀石头布 【费用流】
    hdu6184 Counting Stars 【三元环计数】
    BZOJ4815 [CQOI2017]小Q的表格 【数论 + 分块】
  • 原文地址:https://www.cnblogs.com/akiha/p/13267891.html
Copyright © 2011-2022 走看看