[[类名 alloc] init]; 向类发送 alloc 方法,创建该类的实例并得到指向该实例的指针;之后向创建的该实例发送 init 消息,为实例变量初始化。
init, initWithStyle, initWithNibName ...
很多类有多个初始化方法,能以不同的形势初始化对象,每个初始化方法都以 init 开头(iOS 的命名约定)。
所有的类,无论有多少个初始化方法,都必须选定一个作为“指定初始化方法” ,以 NSObject 为例,因为只有一个初始化方法 init ,所以 init 就是指定初始化方法
也可以自定义类的初始化方法,例如 - (id)initWithObjectName:(NSString *)name Number:(int)value; //方法名或叫选择器。
init 方法返回的类型,永远为 (id) :
为什么不能返回类型 (Object *) 指向该对象的指针,因为 Object 类 的子类会继承 Object 的全部方法,包括初始化方法和返回类型,如果 Object 子类的实例收到了该初始化方法,那么应该返回相应子类的实例;可不可以向C++一样覆盖父类的初始化方法,不可以!因为在 OC 中,一个对象不能同时有两个名字相同的方法(选择器),即使他们的返回类型或参数不同。将初始化方法中的返回类型设置为 (id)任意对象,就能解决这种创建子类时会遇到的问题。
isa 实例变量:
每个对象都拥有一个名为 isa 的实例变量。类在收到 alloc 消息并创建对象后,会设置新建对象的实例变量 isa,指向自己(创建该对象的类)。
isa 意为 (is a),通过该成员变量,可以知道对象 “是” 哪个类的实例。
OC 的很多特性都源自 isa 指针,在运行环境下,对象收到消息后会根据 isa 指针指向的类,执行和该消息匹配的方法。
#初始化方法中的关键字#:
self : 存在于方法中,是一个(隐式 “ implicit ”)局部变量,它不需要声明,而且会自动赋值,指向收到消息的对象自身(类似C++中的 “this”)。通常可以通过 self 向对象自己发送消息。
super :在覆盖子类的某个方法时,需要在父类现有方法已经实现的功能基础上,增加其他功能,为了能方便的完成这个任务 。OC 提供了一个 名为 super 的编译器指令 ; super 的工作方式,当对象收到启动方法查询,从收到消息的对象开始查询与消息同名的方法,未找到,会继续向其父类查找,一直到NSObject ,如果一直未找到,则会抛出异常。
初始化方法链:
比如 Object 的指定初始化方法是 - (id)initWithObjectName:(NSString *)name Number:(int)value;
此外还有另一个初始化方法 init (继承自 Object 的父类 NSObject),向 Object 的实例发送 init 消息并不会执行指定的初始化方法的代码。应该覆盖 init 方法的实现,用默认值调用指定的初始化方法:
- (id)init { return [self initWithObjectName:@"objectName" Number:0]; }
这种“串联”使用初始化方法的机制可以降低出错的几率,也能让代码更容易维护,对于有多个初始化方法的类,程序员在创建时要选中某个初始化方法为“指定初始化方法”,只在指定初始化方法中编写初始化核心代码,其他初始化方法只需有默认值调用该核心即可。