一、构造方法与其重写
构造方法的定义:
用来初始化对象的方法,是个对象方法,“-”开头。
重写-init方法:
- (id)init
{
self = [super init];
if (self != nil)
{
_age = 10;
}
return self;
}
简写作:
- (id)init
{
if (self = [super init])
{
_age = 10;
}
return self;
}
重写构造方法的注意点:
1、先调用父类的构造方法(【super init】)。
2、再进行子类内部成员变量的初始化。
自定义构造方法的规范:
1、一定是对象方法,一定以“-”开头。
2、返回值一般是id类型。
3、方法名一般以initWith开头。
例如:
- (id)initWithName: (NSString *)name andAge: (int)age
{
if (self = [super init])
{
_name = name;
self.age = age;
}
return self;
}
不过最好写成:
- (id)initWithName: (NSString *)name andAge: (int)age
{
if (self = [super initWithName: name])
{
_age = age;
}
return self;
}
(id)initWithName: andAge是父类方法,尽量用父类的成员变量交由父类的方法中进行初始化。
这样写的好处:
1、自己做好自己的事情。
2、父类改变了变量名,子类不用改,封装性好。
父类的成员变量交给父类处理,子类的成员变量交给子类处理。
二、description方法与其重写
NSLog除了可以输出基本数据类型,NSLog函数还可以输出任何OC对象。
Student *stu = [[Student alloc] initWithAge:10];
NSLog(@"%@", stu);
[stu release];
在第3行用NSLog函数输出stu对象,注意左边的格式符%@,以后想输出OC对象,就得用%@这个格式符。
NSLog函数一旦发现用%@输出某个OC对象时,就会调用这个对象的description方法(这个方法返回值是NSString类型,是OC中的字符串类型),并且将description方法返回的字符串代替%@的位置进行输出。
description方法的默认实现是返回这样的格式:<类名: 对象的内存地址>。
Class c = [Person class];
NSLog(@"%@", c);
这里c是类对象,第2行会调用类的 +description方法,拿到+description方法的返回值(NSString *)显示出来。默认输出为类名。
重写description方法
description方法的默认实现是返回类名和对象的内存地址,这样的话,使用NSLog输出OC对象,意义就不是很大,因为我们并不关心对象的内存地址,比较关心的是对象内部的一些成变量的值。因此,会经常重写description方法,覆盖description方法的默认实现。
比如,重写Student的description方法,返回成员变量_age的值。
- (NSString *)description
{
return [NSString stringWithFormat:@"age=%i", _age];
}
在第2行调用了NSString这个类的静态方法stringWithFormat初始化一个字符串对象,并返回这个字符串。
假如_age是10,那么description方法返回的字符串就是@"age=10"。