您的位置:首页 > 移动开发 > Objective-C

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

2015-10-31 17:10 645 查看
也许你会感觉这个问题可能算不上问题,而且会感觉提出这样的问题的人也很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;
}

结果:
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: