也许你会感觉这个问题可能算不上问题,而且会感觉提出这样的问题的人也很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;
}
//自定义初始化方法,给name和gender实例变量赋值
- (instancetype)initWithName: (NSString *)name
Gender: (NSString *)gender;
// 自定义初始化方法,给name和gender和age赋值
- (instancetype)initWithName:(NSString *)name Gender:(NSString *)gender Age:(int)age;
// 自定义初始化方法,给name和gender和hobby赋值
- (instancetype)initWithName: (NSString *)name Gender: (NSString *)gender Hobby: (NSString *)hobby;
// 自定义初始化方法,给name和gender和address赋值
- (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 -指定初始化方法
// 自定义初始化方法,给name和gender实例变量赋值方法的实现
- (instancetype)initWithName: (NSString *)name
Gender: (NSString *)gender{
self = [super init];
if (self) {
_name = name;
_gender = gender;
}
return self;
}
// 给name和gender和age赋值方法的实现
- (instancetype)initWithName:(NSString *)name
Gender:(NSString *)gender
Age:(int)age{
self = [self initWithName: name Gender: gender ];
if (self) {
_age = age;
}
return self;
}
// 给name和gender和hobby赋值方法的实现
- (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;
}
// 给name和gender和address赋值
- (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;
}
结果: