自定义构造方法:
我们已经知道创建对象分两步,1:在内存中开辟存储空间,并把地址存储在指针变量里,2:调用指针变量的初始化方法init初始化该对象。
Student * stu = [Student alloc]; stu = [stu init];
在这里,init方法是系统原始的初始化方法,但有时我们需要重写该初始化方法,使其在创建该对象的同时赋予它属性的值。
假如,我们现在要重写原始初始化方法,使其创建一个有年龄(age)的stu。
首先,在Student.h中声明自定义方法:
- (id)initWithAge:(int)age;
然后,在Student.m中实现该自定义方法:
- (id)initWithAge:(int)age { self = [super init]; //先调用父类的初始化方法,初始化父类 if (self != nil) { //若父类初始化成功,则开始初始化当前对象stu _age = age; } return self; }
注意:构造方法内部首先要调用父类的初始化方法(先把父类的某些东西实现初始化)。若父类初始化成功,则开始初始化当前对象stu(即给stu的属性_age赋值)。
description方法:
我们从打印方法说起。
无论是什么语言的打印方法,都是既可以打印基本类型数据,也可以打印对象。例如:
Student *stu = [[Student alloc] initWithAge:10]; NSLog(@"%@", stu); [stu release];
注意:
NSLog(@"%@");
NSLog()是OC的打印方法。
OC的字符串前面要加@,例:@"wanger";
占位符%@表示对象。
上面的运行结果,打印出来是: <Student: 0x100109910>。
当要打印一个对象时,会自动调用这个对象的description方法,该方法的返回值是字符串类型的,返回的该字符串里有类名和对象地址的信息(<Student:ox100109910>)。
也就是说原始的description方法的作用是返回一个包含类名和对象地址两个信息的字符串。有时我们并不关心类名和地址,它的实际意义不大,所以有时候需要我们重写该description方法,使其返回对我们更有意义的该对象信息字符串。
假如,我们重写该description方法,使其只返回该对象的age
- (NSString *)description { return [NSString stringWithFormat:@"age=%i", _age]; //调用NSString的静态方法stringWithFormmat:,传入_age创建一个字符串,并返回。 }
打印结果为:age = 10
注意:
其实OC里的description方法等同于Java里的toString()方法。它们的作用都是返回该类对象信息的字符串!我们可以根据需要重写它们,使其返回对我们有意义的数据。