你 肯定 已经见过 这样的模式:你 先 为 一个新的物件 分配 内存空间,然后 对 其 初始化,就像 这样:
然后 你 再 将 一些数值 存储 在新的物件当中:
初始化 物件 和 设定 物件的初始值 经常 被整合成 一项措施。比如 你 可以用 initWith::这项措施 同时 初始化 Fraction类型的物件 并且 将 这个Fraction类型物件所代表的分数的分子 和 分母 设定 为两个参数的值。
如果 有 很多项措施 适用于 一类物件 并且 这类物件中的每个个体 都包含 很多个体变量,那么 通常 有 若干项初始化措施 适用于 这类物件。比如 有 6项初始化措施 适用于 基础框架中的NSArray这类物件:
initWithArray:
initWithArray:copyItems:
initWithContentsOfFile:
initWithContentsOfURL:
initWithObjects:
initWithObjects:count:
我们 可以像 这样 对 一个NSArray类型物件所代表的数组 进行初始化:
初始化措施 用 init… 开头 是 常见惯例,你 可以看到 适用于 NSArray这类物件的初始化措施 都遵循了 这个惯例。如果 你 自己 编写 初始化措施,你 应该坚持 下面两个步骤。
如果 有 不止一项初始化措施 适用于 一类物件,那么 其中一项初始化措施 应该是 指定初始化措施,其它的初始化措施 都应该使用 指定初始化措施。编写 指定初始化措施 可以将 主要的初始化代码 集中 在一起。
你 还要确保 一个物件从它所属的大类中继承的变量 得到 正确的初始化,最简单的办法 就是 采取 适用于这个物件所属的那类物件的指定初始化措施。讨论 到这里,我们 现在 可以编写出 initWith::这项措施了:
把 initWith::这项措施 应用 到具体的程序中 是 这样的:
在主程序main()当中,alloc这项措施 分配好了 两块内存空间,用来 存储 两个Fraction类型的物件 。
在initWith::这项措施当中 super 代表 NSObject这类物件,而 init这项措施 也是 适用于NSObject这类物件的。采取 init这项措施过后,结果 会被存储 在initWith::这项措施的实施对象当中,也就是 一个NSObject类型的物件 会被存储 在alloc这项措施所分配的内存空间当中。接着的if()语句 会检查 alloc这项措施所分配的内存空间 是否为 空,如果 不为 空,那么 setNumerator:andDenominator这项措施 就会将 n 和 d这两个参数的值 存储 在alloc这项措施所分配的内存空间当中。最后的return语句 将 alloc这项措施所分配的内存空间的地址 作为结果 传递出去。
这两行语句 会把 两个Fraction类型物件的内存地址 存储 在变量a 和 b当中。我们 来运行 这个程序,看看 initWith::这项措施 有没有出错: