您的位置:首页 > 职场人生

黑马程序员_init的重写

2014-03-30 17:53 197 查看
----------------------
ASP.Net+Unity开发、.Net培训、期待与您交流! ----------------------
 
 
init的重写:

    在OC谈到init这个方法,其实就是把创建对象拆分后研究其原理的组成部分。苹果公司都已经把很多类直接封装好了,初学者尤其见得最多的就是NSObject,init也就是里面的一个对象方法。在刚刚学到创建对象的时候的写法[Person new],其原理也不明白,现在看来是可以把这个拆开成[[Person alloc] init],步骤就是首相给对象分配一个内存也就是[Person alloc]返回一个已经分配好内存的对象,然后再对这个对象进行初始化。有了这个原理,我们就可以对创建的新的对象的初始化按照个人意愿去进行修改了,只要在子类的实现重写init方法就可以了,可以简化后面程序员对变量的使用。

    他的过程是先调用父类的构造方法[super init],这个主要是初始化对象的其他成员变量,完成了这一步再进行子类内部成员变量的初始化。

    其实除了这个固定的写法还可以自定义构造函数,给成员变量赋值,这个和C++的构造函数原理也是一样的,目的都是给成员变量赋初始值。下面代码已注明:

 

/*****  Person class  *********/
@interface Person : NSObject

@property int age; // 这里的功能就是完成get和set方法
@end

@implementation Person
- (id)init
{
if(self = [super init]) // 这里是访问NSObject的init方法
{
_age = 10; // 这里可以把10当作初始值赋给age
}
}
@end

/**********************************/

/******  Student class  **********/

@interface Student : Person
{
int _num;
}
@property int num;
@property int weight;

- (id)initWithWeiht : (int)weight; // 自定义构造函数给成员变量赋初始值

@end

@implementation Student
- (id)init
{
if(self = [super init])
{
_age = 20; // 这里是错误的,因为age是私有成员变量不提供子类直接访问
_num = 1;  // 这里给成员变量num初始化1,创建对象成功后的值
}
}

- (id)initWithWeiht : (int)weight
{
if(self = [super init])
{
_weight = weight; // 这里给成员变量赋传进来的值
}
}

@end

/**********************************/

/************  main  **************/

int main()
{
// id是指向oc对象任何类型的指针,左边是先分配内存,然后再调用对象的init方法初始化成员变量

id p = [[Student alloc] init];

// 这里直接可以按照用户意愿给weight赋初始值,比较方便

id p1 = [Student alloc] initWithWeight : 50];

NSLog(@"初始化后的age是%d,num是%d",p.age, p.num); //点语法输出成员变量的初始化值
}

/**********************************/


 

 

 

----------------------
ASP.Net+Unity开发、.Net培训、期待与您交流! ----------------------详细请查看:www.itheima.com
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: