一.构造方法
构造方法主要用来初始化成员变量。
实现方式:
重写NSObject 类的-(instancetype)init方法
重写规则:
-(instancetype)init
{
//1.重写init方法一定要调用父类的init方法
self=[super init];
//2.判读父类是否初始化成功,self值是否为nil,如果父类初始化成功,self则不为nil
if(self!=nil){
初始化成员变量
}
//3.一定要返回self
return self;
}
为什么要初始化父类,因为继承,子类继承了父类的属性和方法。
提示:以上步骤在XCODE中可以自动生成 ,先输入init ,然后敲回车。
二.自定义构造方法
自定义构造方法规则:
1.对象方法
2.名字为init开头
3.写法和init方法一样
自定义构造方法会从最顶层的init方法开始返回,也就是说要调用父类的初始化方法。
三创建初始化对象的类方法
初始对象类方法命名规则:
1.以+开头
2.返回值是id类型
3.方法名称和类名一样,首字母小写
+(instancetype)className
{
return [[ClassName alloc]init];
}
在父类中创建初始化对象,在初始化方法中,用self,不要写类名,这样增强了可扩展性。
+(instancetype)className
{
return [[self alloc]init];
}
注意:在开发中,既要对象初始方法,也要配套提供类初始方法。
观察NSString 类中的部分初始化方法:
- (instancetype)init;
- (instancetype)initWithString:(NSString *)aString;
- (instancetype)initWithCharacters:(const unichar *)characters length:(NSUInteger)length;
- (instancetype)initWithUTF8String:(const char *)nullTerminatedCString;
- (instancetype)initWithFormat:(NSString *)format, ... NS_FORMAT_FUNCTION(1,2);
+ (instancetype)string;
+ (instancetype)stringWithString:(NSString *)string;
+ (instancetype)stringWithCharacters:(const unichar *)characters length:(NSUInteger)length;
+ (instancetype)stringWithUTF8String:(const char *)nullTerminatedCString;
+ (instancetype)stringWithFormat:(NSString *)format, ... NS_FORMAT_FUNCTION(1,2);
四 重写description方法
description 是NSObject 类中的一个方法(有两个,类方法,对象方法),当用NSLog 打印对象是,就会调用该方法,可以通过重写该方法,用于输出所有成员变量。相当于java中的toString方法。
description用法:
在类中重写description
-(NSString *)description
{
return [NSString stringWithFomat:"格式",变量];
}
五 代码
创建Animal Cat 类,Cat 继承 Animal
1.Animal类
===类声明===
@interface Animal : NSObject
@property (nonatomic,assign)NSInteger age;
@property (nonatomic,copy)NSString *name;
/*
自定义构造方法规则:
1.对象方法
2.名字为init开头
3.写法和init方法一样
*/
-(instancetype)initWithAge:(NSInteger)age;
/*
初始对象类方法命名规则:
1.以+开头
2.返回值是id类型
3.方法名称和类名一样,首字母小写
*/
+(instancetype)animalWithAge:(NSInteger)age;
@end
===类实现===
@implementation Animal
//根据需求1,重写Animal 初始化方法
- (instancetype)init
{
self = [super init];
if (self) {
self.age=1;//该句等价于 [self setAge:1];@property 参数会自动生成
}
return self;
}
//自定义构造方法 上面重写的初始化方法,词不达意,用户不能通过改初始化看出 age赋值为1,可以做一下改进
//不再写死为1,通过用户输入的年龄,初始化。
//注意用户输入的年龄,可能为脏数据,需要重写setAge 方法,要求age必须>=0。
- (instancetype)initWithAge:(NSInteger)age
{
self = [super init];
if (self) {
self.age=age;
}
return self;
}
//重写setAge方法
-(void)setAge:(NSInteger)age
{
_age=age>=0?age:0;
}
//
+(instancetype)animalWithAge:(NSInteger)age
{
//return [[Animal alloc]initWithAge:age];
//在类中通过self,可以增强扩展性
return [[self alloc]initWithAge:age];
}
// 重写description 方法,用于输出所有成员变量。
- (NSString *)description
{
return [NSString stringWithFormat:@"age=%ld,name=%@",self.age,self.name];
}
@end
2.Cat 类
===类声明===
@interface Cat : Animal
-(instancetype)initWithAge:(NSInteger)age andName:(NSString *)name;
+(instancetype)catWithAge:(NSInteger)age andName:(NSString *)name;
@end
===类实现===
@implementation Cat
-(id)initWithAge:(NSInteger)age andName:(NSString *)name
{
self=[super initWithAge:age];//调用父类的initWithAge方法
if(self){
self.name=name;
}
return self;
}
+(id)catWithAge:(NSInteger)age andName:(NSString *)name
{
return [[self alloc]initWithAge:age andName:name];
}
@end
3 主函数
int main(int argc, const char * argv[])
{
@autoreleasepool {
/****************************************
类关系:
父类 Animal 属性 age name
子类 Cat
需求描述:
1.Animal类在初始化的时候给age=1。(动物出生即为1岁)
2.Animal类在初始化通过用户输入年龄进行初始化
3.Cat子类在初始化的时候,通过用户输入 年龄、姓名 进行初始化
4.提供相应的初始化类方法
****************************************/
/*---------需求1---------*/
//调用重写init 方法
Animal *animal = [[Animal alloc]init];
NSLog(@"%@",[animal description]);
//调用自定义init初始化方法
Animal *animal2 = [[Animal alloc]initWithAge:3];
NSLog(@"%@",[animal2 description]);
//调用初始化类方法
Animal *animal3 = [Animal animalWithAge:5];
NSLog(@"%@",[animal3 description]);
/*---------需求2---------*/
//调用自定义init初始化方法
Cat *cat = [[Cat alloc]initWithAge:5 andName:@"小花猫"];
NSLog(@"%@",[cat description]);
//调用初始化类方法
Cat *cat1 = [Cat catWithAge:60 andName:@"小黑猫"];
NSLog(@"%@",[cat1 description]);
}
return 0;
}
===输出===
2014-10-21 21:58:54.750 构造方法[394:303] age=1,name=(null)
2014-10-21 21:58:54.751 构造方法[394:303] age=3,name=(null)
2014-10-21 21:58:54.751 构造方法[394:303] age=5,name=(null)
2014-10-21 21:58:54.751 构造方法[394:303] age=5,name=小花猫
2014-10-21 21:58:54.752 构造方法[394:303] age=60,name=小黑猫