在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;
}
结果:
一、先讲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;
}
结果:
相关文章推荐
- HANA学院(05)_- SAP HANA分析基础使用-01SAP BusinessObjects Explorer
- Objective-c单例模式的正确写法
- ios开发-Objective-C之内存管理机制
- 【安卓-动画】使用ObjectAnimator实现ArcMenu动画效果
- Page-Object思想
- 第五天(objective-c)(类和对象)
- 康大亮Objective-C全部语法整理
- 问题:无法访问 private 成员(在“CObject”类中声明)
- Objective-C中的@property和@synthesize用法
- Objective-C中得MRC与ARC
- Object
- OC语法
- IOS开发基础Object-C(02 )—第一个OC类
- 《JavaScript高级编程》读书笔记——引用类型一:Object和Array
- Xcode 7.1项目中Objective-C和swift混合编程(一)
- Objective-C:数组排序、过滤
- IOS开发基础Object-C(01)— OC概述及比较
- firefox下jquery ajax 返回 [object XMLDocument]处理
- “CObject::CObject”: 无法访问 private 成员(在“CObject”类中声明)
- Object-C目录