----------------------
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