在Objective-C中关于self和super功能用法的疑惑与分析-康大亮

也许你会感觉这个问题可能算不上问题,而且会感觉提出这样的问题的人也很low,可是,我就是这么low。

        

       一、先讲self

首先,self关键字会在两个场合出现。

其次,根据出现场和的不同,self有着不同的表现,也就是作用。

1.当self出现在类方法中时,self代表调用该方法的类

2.当self出现在实例方法中时,self代表调用该方法的对象

        总之,self总是代表当前方法的调用者!当这个方法被调用时,他所代表的对象随之被确定下来:谁在调用该方法,self就代表谁。


      二、再讲super

        首先,如果需要在子类方法中调用父类被覆盖的方法,则可以使用super关键字来调用父类被覆盖的方法。

其次,super的作用是用于限定该对象调用他从父类继承得到的属性或方法。

        1.当在类方法中使用super调用父类的方法时,被调用的父类方法只能是类方法。

2.当在实例变量方法使用super调用父类的方法时,被调用的父类方法只能是实例方法。



代码示例如下:

.h文件

#import <Foundation/Foundation.h>


@interface Person : NSObject

{

    NSString *_name;

    NSString *_gender;

    NSString *_hobby;

    NSString *_address;

    int _age;

}





//自定义初始化方法,给namegender实例变量赋值

- (instancetype)initWithName: (NSString *)name

                      Gender: (NSString *)gender;


// 自定义初始化方法,给namegenderage赋值

- (instancetype)initWithName:(NSString *)name Gender:(NSString *)gender Age:(int)age;


// 自定义初始化方法,给namegenderhobby赋值

- (instancetype)initWithName: (NSString *)name Gender: (NSString *)gender Hobby: (NSString *)hobby;


// 自定义初始化方法,给namegenderaddress赋值

- (instancetype)initWithName: (NSString *)name gender: (NSString *)gender address: (NSString *)address;






// getter

- (NSString *)name;

- (NSString *)gender;

- (NSString *)hobby;

- (NSString *)address;

- (int)age;


//  自定义description方法

- (NSString *) description;




@end





.m文件

#import "Person.h"


@implementation Person

#pragma mark -指定初始化方法

// 自定义初始化方法,给namegender实例变量赋值方法的实现

- (instancetype)initWithName: (NSString *)name

                      Gender: (NSString *)gender{

    self = [super init];

    if (self) {

        _name = name;

        _gender = gender;

    }

    

    return self;

}



// namegenderage赋值方法的实现

- (instancetype)initWithName:(NSString *)name

                      Gender:(NSString *)gender

                         Age:(int)age{

    self = [self initWithName: name Gender: gender ];

    if (self) {

        _age = age;

    }

    

    return self;

}


// namegenderhobby赋值方法的实现

- (instancetype)initWithName: (NSString *)name

                      Gender: (NSString *)gender

                       Hobby: (NSString *)hobby{

    self = [self initWithName:name Gender: gender ];

    if (self) {

        //        _name = name;

        //        _gender = gender;

        _hobby = hobby;

    }

    return self;

}


// namegenderaddress赋值

- (instancetype)initWithName: (NSString *)name

                      gender: (NSString *)gender

                     address: (NSString *)address{

    

    self = [self initWithName:name Gender: gender ];

    if (self) {

        //        _name = name;

        //        _gender = gender;

        _address = address;

    }

     return self;

}






// getter

- (NSString *)name{

    return _name;

}

- (NSString *)gender{

    return _gender;

}


- (NSString *)hobby{

    return _hobby;

}


- (NSString *)address{

    return _address;

}


- (int)age{

    return _age;

}




// description方法是由系统提供的一种描述对象特征的一个实例方法,默认在打印一个对象时,会调用该方法,返回类名+对象地址。我们可以重写这个方法,将若干实例变量拼接为一个字符串返回,这样就可以打印我们想要的信息。

- (NSString *) description{

    // 使用字符串类,创建出一个字符串对象,然后使用格式初始化方法来将参数拼接进这个字符串对象

    NSString *string = [[NSString alloc] initWithFormat:@"嘿,你的名字是:%@,你的性别:%@,爱好: %@ ,地址:%@, 年龄:%d", _name, _gender, _hobby,_address, _age ];

    return string;

}




@end




main.m文件

#import <Foundation/Foundation.h>

#import "Person.h"

int main(int argc, const char * argv[]) {

    Person *person1 = [[Person alloc]initWithName:@"陈冠希" Gender:@"公公"];

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


    Person *person2 = [[Person alloc] initWithName:@"张柏芝" Gender:@"" Age:30];

    NSLog(@"%@", person2);

    

    Person *person3 = [[Person alloc] initWithName:@"谢霆锋" Gender:@"" Hobby:@"拍电影"];

    NSLog(@"%@", person3);

    

    Person *person4 = [[Person alloc] initWithName:@"张国荣" gender:@"" address:@"香港"];

    NSLog(@"%@", person4);

    return 0;

}



结果:

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值