一、self和super关键字
OC中提供了两个关键字self和super,用于在方法定义中引用执行该方法的对象。
OC中的self相当于C++和Java中的this指针
super调用的是父类方法
self的应用场景有4个:
- 用在类方法中
- 用在对象方法中
- 访问成员变量
- self在OC的内存管理中的特殊使用
当前介绍self的前三种用法和super的用法
1. self在对象方法中的使用,此时self指代调用当前方法的对象
代码举例:
定义一个Person类,在.h文件中声明一个对象方法test,在.m文件中实现,实现代码如下:
#import "Person.h"
@implementation Person
//在test方法中打印出self的地址
-(void)test{
NSLog(@"self address=%p",self);
}
@end
在main方法中创建一个Person的实例对象p,p调用对象方法eat,此时self指代调用eat方法的实例对象p
#import <Foundation/Foundation.h>
#import "Person.h"
int main(int argc, const char * argv[]) {
@autoreleasepool {
Person *p=[Person new];
//打印出实例对象p的地址
NSLog(@"p address=%p",p);
//调用test方法打印出self地址
[p test];
}
return 0;
}
输入结果如下:
2. self在类方法中的使用,此时self指代调用当前方法的类
示例代码如下:
在Person类中定义一个类方法test,在类方法中打印出self地址,在.m文件中的实现代码如下:
#import "Person.h"
@implementation Person
+(void)test{
//在类方法中打印出self的地址
NSLog(@"self address=%p",self);
}
@end
在main方法中调用类方法test,打印出调用当前类方法的类对象的地址和self的地址比较,实现代码如下:
#import <Foundation/Foundation.h>
#import "Person.h"
int main(int argc, const char * argv[]) {
@autoreleasepool {
//创建Person类的一个实例对象p
Person *p=[Person new];
//用对象的class方法返回当前类
Class person=[p class];
NSLog(@"Person address=%p",person);
//调用类方法test
[Person test];
}
return 0;
}
运行程序,打印结果如下,self的地址和调用当前类方法的类对象的地址一样,说明self指代当前调用该方法的当前类
3. self访问成员变量
当局部变量和成员变量同名时,局部变量会暂时屏蔽成员变量,用"self—>属性名称"的方式访问成员变量
比如以下示例代码:
在set方法中形参名和成员变量名相同,用self—>speed的方式访问成员变量speed
-(void)setSpeed:(int)speed{
self->speed=speed;
}
4.super调用父类方法
示例代码如下:
在子类中重写init方法时用[super init]调用父类的init方法
-(instancetype)init{
//调用父类的init方法
if (self=[super init]) {
_age=10;
}
return self;
}