1: 在 既有类中使用 关联对象存放自定义数据

有时候需要在对象中存放相关信息, 这是我们经常会从对象所属的类中继承一个子类, 然后改用这个子类对象, 然而并非所有的情况下都能这么做,  有时候类的实例可能是由某种机制所创建的, 而开发者无法令这种机制创建出自己缩写的子类实例, OC  中有一项强大的特性可以解决此问题, 这就是 '关联对象'

2:在类继承体系中查询类型信息

isMemberOfClass: 能够判断出对象是否为某个特定类的实例, 而 isKindOfClass: 则能够判断出对象是否为某类 或 其派生类的实例, 例如;

NSMutableDictionary * dict = [NSMutableDictionary  new];

[dict isMemberOfClass: [NSDictionary  class]]; 为 NO

[dict isMemberOfClass: [NSMutableDictionary  class]]; 为 YES

[dict isKindOfClass: [NSDictionary  class]]; 为 YES

[dict isKindOfClass: [NSArray  class]]; 为 NO

总结:

每个实例都有一个指向 Class 对象的指针, 泳衣表明其类型, 而这些 Class 对象则构成了类的继承体系.

如果对象类型无法在编译期确定, 那么就应该使用类型信息查询方法来探知.

尽量使用类型信息查询方法来确定对象类型, 而不要直接比较类对象, 因为某些对象可能实现了消息转发功能.

3: 用前缀避免命名空间冲突

OC 没有其他语言那种内置的命名空间机制, 鉴于此, 我们在其名时要设法避免潜在的命名冲突.

避免此问题的唯一办法就是变相实现命名空间, 为所有名称都加上适当前缀, 所选前缀可以是与公司, 应用程序或二者皆有关联之名.

使用 Cocoa 创建应用程序时一定注意, Apple 宣称 其保留使用所有 '两字母前缀'的权利, 所以你自己选用的前缀应该是三个字母的.

不仅是类名, 应用程序中的所有名称都应加前缀, . 如果要为既有类新增 '分类', 那么一定要给 '分类'  及 分类 中的方法加上前缀,

总结:

选择与你的公司, 应用程序 或 二者皆有关联之名称作为类名的前缀, 并在所有的代码中均使用这一前缀.

若自己所开发的程序库中使用到了第三方库, 则应为其中的名称都加上 前缀.

4: 提供 ' 全能初始化方法 '

所有对象均瑶初始化, 在初始化时, 有些对象可能无需开发者想起提供额外信息. 不过一般还是要提供的. 我们把这种可为对象提供必要信息以便完成工作的初始化方法叫做  ' 全能初始化 '(指定初始化方法)

如果创建类实例的方式不止一种,, 那么这个类就会有多个初始化方法, 这当然很好, 不过仍然要在其中选定一个作为全能初始化方法, 令其他初始化方法都来调用它. 于是, 只有在全能初始化的方法中, 才会存储内部数据, 这样的话, 当地曾数据存储机制改变时, 只需修改全能初始化方法的代码即可. 无需改动其他初始化方法.

如果子类的全能初始化方法与超类方法的名称不同, 那么总应该覆写超类的全能初始化方法

总结:

在类中提供一个全能初始化方法, 并与文档中指明, 其他初始化方法均应调用此方法

若全能初始化方法与超类不同, 则需要覆写超类对应的方法

如果超类的初始化方法不使用子类, 那么应该覆写 这个超类方法, 并在其中抛出异常

最新文章

  1. Sqli-LABS通关笔录-7[文件写入函数Outfile]
  2. CentOS版本选择说明
  3. 【002: NetBeans 的 代码补全】
  4. DataGridView常用操作
  5. itextsharp、Aspose.Words、Aspose.Cells联合使用
  6. SQL server 学习笔记1
  7. To add private variable to this Javascript literal object
  8. Django文档——Model字段选项(Field Options)
  9. Searching in a rotated and sorted array
  10. ll 详解
  11. MySQL索引的使用方式
  12. [bzoj4881][Lydsy2017年5月月赛]线段游戏
  13. LeetCode136.只出现一次的数字
  14. 学习笔记DL008:概率论,随机变量,概率分布,边缘概率,条件概率,期望、方差、协方差
  15. 省市区三级联动(附j全国省市区json文件)
  16. Ubuntu18.04下使用Blender进行视频格式转换
  17. HAproxy目录分发
  18. 局部方法$("html").load()和全局方法$.get()、$.post()
  19. cesium编程中级(一)添加示例到Sandcastle
  20. 算法08 五大查找之:二叉排序树(BSTree)

热门文章

  1. swiper 轮播图,拖动之后继续轮播
  2. WEB通知和React Native之即时通讯(iOS Android)
  3. JDK环境配置(Windows)
  4. flex知识点归纳
  5. Windows 10 Update
  6. Django+Vue打造购物网站(五)
  7. hihoCoder #1770 : 单调数(数位dp)
  8. 如果固定电脑ip地址
  9. 状态压缩动态规划 状压DP
  10. 金融量化分析【day112】:股票数据分析Tushare1