您的位置:首页 > 其它

- (id)init 什么时候调用?重写和重载的区别

2016-03-30 12:01 274 查看
关于下面函数有的时候调用,有的时候不调用,这种非常弱智的问题,我真的不太懂,查看了得到的结论是

<span style="background-color: rgb(0, 0, 0);">- (id)init {
if (self = [super init]) {
[self loadPreference];
}
return self;
}</span>


该函数返回一个指向对象本身的指针。调用系统init方法后,所有成员变量都默认初始化为0,如果我们希望一些成员变量初始化后的值不为0,那么我们就需要自定义类的初始化函数。

切记函数返回类型为id类型。

重写init函数

看下面代码

@interface Person:NSObject
@property int age;
- (id)init;  //自定义初始化函数声明
@end

@implementation Person
- (id)init
{
//首先调用父类的init方法
self = [super init];
//若成功返回指向对象的指针则进行初始化
if(self) //即self!=nil;
{
_age = 10;
}
return self; //返回初始化完毕的对象
}
@end


从代码中可以看出,重载初始化init方法包含三步骤:

调用父类的init方法,初始化父类的成员变量及属性;
判断是否成功初始化父类,如果成功则初始化自己的成员变量及属性;
返回对象本身

说明:子类重载父类init方法后,子类对象优先调用子类的init方法。

自定义类的初始化函数

看下面代码:

@interface Person:NSObject
@property int age;
- (id)initWithAge:(int)age;  **//自定义初始化函数声明**
@end

@implementation Person
- (id)initWithAge:(int)age
{
//调用父类的init方法,若成功返回指向对象的指针则进行初始化
if(self = [super init]) //即self!=nil;
{
_age = age;
}
return self; //返回初始化完毕的对象
}
@end


重载和重写的区别
重写:
在Objective-c中,子类可继承父类中的方法,而不需要重新编写相同的方法,直接可以使用父类的方法。

但有时我们不想使用使用父类方法,而是想作一定的修改,怎么办呢?只要将子类中书写一个与父类具有相同的方法名、返回类型和参数,就可以将将父类的方法覆盖重写。比较简单。

重载:
在Objective-c中,方法是不能重载的。也就是说我们不能在类中定义这样的两个方法:它们的名子相同,参数个数相同,参数类型不同,不同的返回值类型。否则Xcode会报错

参考一下博客
http://www.lxway.com/405695666.htm

http://www.jianshu.com/p/bad19a32d39d
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: