黑马程序员——Objective-C——构造方法和description方法

———Java培训、Android培训、iOS培训、.Net培训、期待与您交流! ———

 

一、构造方法

1> 概念

创建一个Person类型的对象:Person *person = [Person new];

事实上,上面new方法完成了两件事:

a. 使用+alloc方法来分配存储空间(返回分配的对象);

b. 使用-init方法来对对象进行初始化。

即可以这样创建对象:Person *person = [[Person alloc] init];

像-init这样用来初始化对象的方法,我们可以称为"构造方法"。

2> 使用注意

子类拥有的成员变量包括自己的成员变量以及从父类继承而来的成员变量,在重写构造方法的时候应该首先对从父类继承而来的成员变量先进行初始化。

原则:先初始化父类的,再初始化子类的。即先调用父类的构造方法[super init]; 再进行子类内部成员变量的初始化。

3> 构造方法的作用:

让对象方法一创建出来,成员变量就会有一些固定的值。

4> 实例代码:

要求:创建一个Person对象,让对象以创建出来默认就是20岁

// .h文件中
@interface Person : NSObject
// 声明Person对象的属性,同时生成set、get方法
@property int age;
@end
// .m文件中
@implementation Person
// 重写构造方法
- (id)init
{
	if (self = [super init])  // 必须先调用父类的init方法
	{
		_age = 20;  // 设置初始化属性值
	}
return self;  // 返回生成的初始化对象
}
@end
// main.m中
int main ()
{
	Person *person = [[Person alloc] init]; // 此时创建出来的人对象年龄是20
	NSLog(@”这个人的年龄是%d”,person.age);
	return 0;
}

5>自定义构造方法

默认的构造方法,也就是-init方法,它是不接收任何参数的。因此,在实际开发中,为了方便,会经常自定义构造方法。

注意点:

a. 一定是对象方法,以减号开头

b. 返回值一般是id类型

c. 方法名一般都以init开头

d. 谁的属性就在谁那里初始化

实例代码:

// 这里只写出主要代码
// Person类的.m文件
@implementation
- (id)initWithAge:(int)age
{
	if (self = [super init]) // 调用父类的init方法
	{
		_age = age; // 设置初始化属性值
	}
	return self;
}
@end
// Student类的.m文件,这里假设Student继承了Person类
@implementation
- (id)initWithName:(NSString *)name andAge:(int)age
{
	if (self = [super initWithAge:age]) // 因为age是父类的属性,所以交给父类初始化
	{
		_name = name; // 设置自己的属性值
	}
	return self;
}
@end

二、description方法

1.说明:包括类方法和对象方法

1> -description(对象方法)

使用NSLog和@%输出某个对象时,会调用对象的-description方法,并拿到返回值进行输出。默认打印:类名+地址

2> +description(类方法)

使用NSLog和@%输出某个类对象时,会调用类对象的+description方法,并拿到返回值进行输出默认打印:类名

例如:

// 假设Person是一个类
Person *person = [[Person alloc] init]; // 创建一个对象

NSLog(“%@”,person);  // 打印结果是

NSLog(“%@”,[person class]);  // 打印结果是person;

2.重写description方法

1>作用

有时我们需要打印对象的属性,这时可以重写-description方法

例如,要打印初Person的属性值

// 主要代码
- (NSString *)description  // description方法返回值是NSString *类型
{
	return [NSString stringWithFormat:@”name = %@,age = %@”,self.name,self.age]; 
}

2>注意点

a. description方法返回NSString*类型

b. 不可以在description中使用NSLog和%@打印self,会引发死循环。





你可能感兴趣的:(Objective-C)