OC学习笔记十四 构造函数

为什么80%的码农都做不了架构师?>>>   hot3.png

一.构造方法

构造方法主要用来初始化成员变量。

实现方式:

重写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=小黑猫


转载于:https://my.oschina.net/wolx/blog/335954

你可能感兴趣的:(OC学习笔记十四 构造函数)