alloc + init内存使用机制

Had*_*adi 8 objective-c foundation

我只是想知道一个对象何时被alloc分配,并且分配了一块内存,为什么init不使用那段内存并更改对象的地址?

NSDate *t = nil;
NSLog(@"t = %p",t); // t = 0x0 

t = [NSDate alloc];
NSLog(@"t = %p",t); // t = 0x100107af0

t = [t init];
NSLog(@"t = %p",t); // t = 0x1001035a0
Run Code Online (Sandbox Code Playgroud)

Cod*_*aFi 1

两步初始化允许我们做这些事情(即,根据调用的初始化程序将类的实例替换为另一个类的实例)。Foundation 和 UIKit 上的类集群都利用这一点来返回针对特定用例优化的实例。例如,UIColor它本身只是其子类的一个接口,用于实现颜色缓存(所有命名初始化程序,如+blackColor)、RGB 颜色空间 ( +colorWithRed:green:blue:alpha)、黑白颜色空间 ( +colorWithWhite:alpha:)、CIColor兼容性等。也是如此NSDate。当你打电话时-init,苹果有办法和动机返回一个实现相同接口的不同对象作为NSDate优化,因为老实说,你不应该关心你得到什么,只要当你尝试正确发送消息时它不会发射导弹。 。