在object-c编程中经常通过调用alloc和init两个方法来生成一个新的实例。alloc方法用于分配新对象的内存空间,init方法用于完成新对象的初始化(实例变量初始化为0,isa初始化为类对象等等)。比如以下代码:
id myobject = [Myobject alloc]; [myobject init]; [myobject method];
首先向Myobject类对象发送alloc消息,返回一个已经分配空间的新对象实例,赋值给myobject变量。接着向新对象发送init消息,完成新对象的初始化工作。最后调用了新对象的方法。
以上代码存在问题,对比以下代码,唯一的区别是myobject变量保存的新对象的实例。在这里,myobject保存的是init方法调用返回的新对象,而不是alloc。这有什么区别了?区别在于,当向调用alloc方法生成的新对象发送init消息后,调用init方法返回的对象实例可能发生变化,不是原来的接受者对象。这种情况是可能的,比如,一个类保存了一组命名的对象,并且这个类提供了一个初始化方法initWithName:,这个方法用于初始化一个新的实例。假如一个名字只能对应一个对象,那么当你调用这个类的initWithName:方法时,它将拒绝分配同一个名字给两个不同的对象。当尝试分配一个名字给一个新的实例,而这个名字已经被其他对象使用,那么它将释放新的实例的内存,放回另外的一个已经绑定名字的对象。所以,在某些情况下,调用init返回的对象和alloc返回的对象有可能不是同一个对象,而在程序中,应该使用init返回的对象。
id myobject = [[Myobject alloc] init]; [myobject method];
posted on
浙公网安备 33010602011771号