构造方法主要用来初始化成员变量。
实现方式:
重写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 是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=小黑猫