一:构造说法说明:
(1)init方法就是构造方法,是用来初始化对象的方法,注意这是一个对象方法,一减号开头。
默认初始化完毕后,所有成员变量的值都为0。
(2)子类拥有的成员变量包括自己的成员变量以及从父类继承而来的成员变量,在重写构造方法的时候应该首先对从父类继承而
来的成员变量先进行初始化。
(3)原则:先初始化父类的,再初始化子类的。
二:代码示例
main函数代码示例:(详细解释都写在代码里了,请认真查看)
#import <Foundation/Foundation.h>
#import "Student.h"
int main(int argc, const char * argv[]) {
@autoreleasepool {
//一开始我们都是调用父类init这个构造方法来初始化内存
//Student *stu = [[Student alloc]init];
Student *stu2 = [[Student alloc]initWithAge:24 andNo:25];
NSLog(@"age = %i ,no = %i",stu2.age,stu2.no);
//我们直接打印stu2
NSLog(@"%@",stu2);//重写description方法之前,结果为<Student: 0x100204890>
// 重点!!!!!!打印出来会是内存地址,因为stu实际上存的就是地址,跟指针一样,OC中为了方便理解把stu当成一个对象
//编译器在打印OC对象的时候其实是调用了description方法,我们重写一下这个方法
//重写description方法之后的结果为:age = 24 ,no = 25
}
return 0;
}
//构造方法最好以init开头
#import <Foundation/Foundation.h>
@interface Student : NSObject
{
int _age;
int _no;
}
- (void)setAge:(int)age;
-(int)age;
-(void)setNo:(int)no;
-(int)no;
//自定义一个构造方法,构造方法最好以init开头
-(id)initWithAge:(int)age andNo:(int)no;
@end
重点:.m文件的实现和description方法示例:(其中还用到了self的知识)
注意:什么时候会调用description 方法呢?其实就是在打印对象的时候调用的,如果你用的是系统类比如说NSString 类,那么你就不用再重新写了因为系统已经帮你写好了,我们一般都是自己创建对象,并打印的时候才用description。
#import "Student.h"
@implementation Student
-(void)setAge:(int)age
{
_age = age;
}
-(int)age
{
return _age;
}
-(void)setNo:(int)no
{
_no = no;
}
-(int)no
{
return _no;
}
//实现自定义构造方法
- (id)initWithAge:(int)age andNo:(int)no
{
//继承父类,先调用父类的构造方法
self = [super init];
//调用完父类的init之后我们要把它赋值给当前对象,也就是self,self就指向了当前对象,我们当前对象就被父类创建好了
//有时候父类的构造方法返回值为nil,所以我们就需要先判断一下
if (self != nil) {
_age = age; //相当于 self.age = age;
_no = no; //相当于 self.no = no;
}
//注意!!!!!!!!!!上面是一般方法下面是精华方法
/*
if(self = [super init]){ (是一个= 不是两个,要注意)
self.age = age;
self.no = no;
}
*/
return self;
}
//重写父类的description方法
-(NSString *)description
{
//stringWithFormat 拼接字符串,NSStrig 类的一个方法,后面会说到
Student *stu = [NSString stringWithFormat:@"age = %i ,no = %i",_age,_no];//相当于self.age,self.no
return stu;
}
@end