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

来源:互联网 发布:文都医考app软件下载 编辑:程序博客网 时间:2024/05/17 21:56

也许你会感觉这个问题可能算不上问题,而且会感觉提出这样的问题的人也很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 = [superinit];

   if (self) {

       _name = name;

       _gender = gender;

    }

    

    return self;

}



// namegenderage赋值方法的实现

- (instancetype)initWithName:(NSString *)name

                      Gender:(NSString *)gender

                         Age:(int)age{

   self = [selfinitWithName: name Gender: gender ];

   if (self) {

       _age = age;

    }

    

    return self;

}


// namegenderhobby赋值方法的实现

- (instancetype)initWithName: (NSString *)name

                      Gender: (NSString *)gender

                       Hobby: (NSString *)hobby{

   self = [selfinitWithName: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 = [selfinitWithName: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 = [[NSStringalloc] 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 = [[Personalloc]initWithName:@"陈冠希"Gender:@"公公"];

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


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

   NSLog(@"%@", person2);

    

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

   NSLog(@"%@", person3);

    

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

   NSLog(@"%@", person4);

   return 0;

}



结果:

0 0
原创粉丝点击