今天看 Xcode 文档 Concepts in Objective-C Programming 中的 Class Clusters,文中以 NSNumber 为例做介绍,对于 class methods 建立 instances of its private subclasses,例如,[NSNumber numberWithInt:5],我们很容易猜测到其代码实现,但是,标准的 alloc… 和 init… methods 也建立 instances of its private subclasses 就让人困惑了,因为 [NSNumber alloc] 会分配 NSNumber 的instances,而不会是 instances of its private subclasses,难道在 initWithInt:5 内部又分配并初始化了 instances of its private subclasses?猜测应当是这样的,那就实际验证一下,输入如下代码:
1 NSNumber *number = [NSNumber alloc];
2 NSNumber *number1 = [number initWithInt:5];
3 NSNumber *number2 = [number initWithInt:6];
并在第1行设置断点,执行这一句后,在 Debug area 的 Console 会不停打印 Did you forget to nest alloc and init?,
在 Console 输入如下命令:
p number
结果是
(NSPlaceholderNumber *) $0 = 0x000000014c6047f0 (null)
接着继续执行第2和3句,再在 Console 输入如下命令:
p number1
结果是
(__NSCFNumber *) $1 = 0xb000000000000052 (int)5
在 Console 输入如下命令:
p number2
结果是
(__NSCFNumber *) $2 = 0xb000000000000062 (int)6
number 的 class 是 NSPlaceholderNumber,跟 number1 和 number2 是不同的对象,这就验证了刚才的猜测,在 instance method initWithInt: 内部又分配和初始化了 class __NSCFNumber 的 instance,即 [[NSNumber alloc] initWithInt:5] 首先建立 instance of NSPlaceholderNumber,然后在 initWithInt: 内部又分配和初始化了 instance of __NSCFNumber,instance of NSPlaceholderNumber 会立即释放。