两种不同的创建对象的方法:
(1):[类名 new];
(2):[[类名 alloc] init]
这两种方法是等价的,不过Cocoa惯例是使用alloc和init而不使用new.
类簇:一群隐藏在通用接口之下的与实现相关的类。在Cocoa中,许多类实际上是以类簇的方式实现的。创建NSString对象时,实际上获得的可能是NSLiteralString、NSCFString、NSSimpleCString、NSBallOfString或者其他未写入文档的与实现相关的对象。
if(self = [self init]){ }
该声明中最先运行的代码是[super init],其作用是让超类完成其自身的初始化工作。对于继承了NSObject的类来说,调用超类的init方法可以让NSObject执行它所需的所有操作,以便对象能够响应消息并处理保留计数器。而对于从其他类继承的类,通过这种方法可以实现自身的全新初始化。像这样的init方法可能会返回完全不同的对象。请记住,self参数是通过固定的距离寻找实例变量所在的内存位置的。如果从init方法返回一个新对象,则需要更新self,以便其后的实例变量的引用可以被映射到正确地内存位置。
惰性求值(lazy evaluation):即便你目前没有设置自定义属性的值,也应该等到调用者需要时再创建对象。
指定初始化函数(designated initializer):即类中的某个初始化方法被指派为指定初始化函数。该类的所有初始化方法都使用指定初始化函数执行初始化操作,而子类使用其超类的指定初始化函数进行超类的初始化。通常,接收参数最多的初始化方法是最终的指定初始化函数。
如果创建了一个指定初始化函数,则一定要在你自己的指定初始化函数中调用超类的指定初始化函数。
如果使用了alloc,copy或new方法获得了一个对象,则该对象的保留计数器的值为1,而且你要释放它。
每个对象都维护一个保留计数器。对象被创建时,其保留计数器的值为1;对象被保留时,起保留计数器的值加1;对象被释放时,其保留计数器的值减1;当保留计数器的值归0时,对象被销毁。
当对象接受到一条autorelease消息时,其保留计数器的值并不会发生改变。该对象只是被放入了NSAutoreleasePool当中。当自动释放池被销毁时,会向池中的所有对象发送release消息,所有被自动释放的对象都将其保留计数器的值减1.如果保留计数器的值归0了,则对象被销毁。
Cocoa有三个关于对象及其保留计数器的规则:
1):如果使用new,alloc或copy操作获得了一个对象,则该对象的保留计数器的值为1。
2):如果通过其他方法获得一个对象,则假设该对象的保留计数器的值为1,而且已经被设置为自动释放了。
3):如果保留了某对象,则必须保持retain方法和release方法的使用次数相等。