浅析关于ObjectC中的自定义初始化方法和便利构造器以及重写父类的description方法的理解

            自定义初始化方法和便利构造器以及重写父类的description方法三种方法的使用在ObjectC中应用非常广泛,但是之前一直对于这3种方法的使用出现差错,现将这三种常见方法进行一个简单地梳理,以便加深理解。
=========================================================================================
1.指定初始化方法是对父类的init方法实现的重载,没必要在.h文件中进行声明,此方法被本类中其他方法调用。
.m文件
- (instancetype)initWithName: (NSString *)name

                         gender: (NSString *)gender

                             ID: (int)ID{

     // 本类中变量初始化

   if ([superinit]) {//也可以self = [self init],以便被本类中其他方法(init方法)调用。此处self执行的是该方法的对象

        //直接赋值的方式,并没有考虑该实例变量的语义设置,所以也就没有相关的内存操作。

        //我们可以调用实例变量的setter方法,来给实例变量赋值,这样就可以使用setter方法中的内存操作来保证实例变量的内存安全性。

//        _name = name;

       self.name = name;

//        _gender = gender;

       self.gender = gender;

//        _ID = ID;

       self.ID = ID;

    }

    return self;

}


=========================================================================================

2.便利构造器:是类方法,封装了alloc和init方法,使用起来更方便

.h文件

+ (instancetype)studentWithName:(NSString *)name gender:(NSString *)gender ID:(int)ID


.m文件

+ (instancetype)studentWithName:(NSString *)name gender:(NSString *)gender ID:(int)ID{

   return [[Studentalloc] initWithName:namegender:genderID:ID];// 这里已经不是以前的self了

}

main.m文件

// 调用便利构造器

    Student *stu = [StudentstudentWithName:@"康大亮"gender:@"m"ID:100650114];//使用便利构造器创建学生对象

   NSLog(@"姓名:%@,性别:%@,学号:%d", [stuname], [stu gender], [stuID]);

    stu.name =@"诸葛孔明";

   NSLog(@"姓名:%@", stu.name);


=========================================================================================

3.重写父类的description方法 

description方法:当使用%@打印一个对象的时候,会调用这个方法 

 在.m文件中,重写description方法: 

#pragma mark --重写系统提供的初始化方法

// 重写系统提供的初始化方法来定制自己需要的实例变量的值!

- (instancetype)init{

    

    _name = @"张三"; // _name的可见度是默认的、受保护的可见度(protected),在类的内部可以直接访问。

    return self;

}


在main.m的main函数中测试: 

#pragma mark -访问实例变量

    // 创建一个person对象

    Person *person1 = [[Person alloc] init];

    

//    person1->_name = @"刘蜀葵";  // 因为_nameprotected可见度,所以在这里不能直接访问

    

    

//    person1->_gender = @"";   // 因为_gender@private修饰的可见度,所以在这里不能直接访问

    

    

    person1->_age = 23 // 因为_age@public修饰的可见度,所以可以在这里访问到

    NSLog(@"%@", [person1 name]);


输出结果:

2013-07-19  13:56:36.834 OC02实例变量可见度和方法-1[1305:85014]张三



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章