-----------android培训、java培训、java学习型技术博客、期待与您交流!-----------
OC中self和super关键字的使用
一、self和super简介
OC中的self,相当于C++、java中的 this 指针,用于在方法定义中引用执行该方法的对象
super发送的消息可以将方法实现分发给父类, 用于调用父类的方法,可以重写已有的方法或者将它添加到现有的方法中,仍然可以将原始的方法纳入到修改后的方法中
二、self的应用场景
1、用在对象方法中
#import <Foundation/Foundation.h>
//方法声明
@interface Person:NSObject
-(void) run;
-(void) eat: (NSString *) foodname;
@end
//方法实现
@implementation Person
-(void) run{
NSLog(@"人正在跑");
}
-(void) eat: (NSString *) foodname{
NSLog(@"人在吃%@",foodname);
[self run];
}
@end
int main (int argc, const char *argv[])
{
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
//在此处输入Objective-C代码
//创建对象
Person *p = [Person new];
//调用方法
//[p run];
[p eat: @"油条和鸡蛋"];
[pool drain];
return 0;
}
2、用在类方法中
#import <Foundation/Foundation.h>
//类方法的声明
@interface Person: NSObject
//定义类方法
+(void)test;
+(void)run;
@end
//类方法实现
@implementation Person
+(void)test{
NSLog(@"这是类方法!self = %p",self);
}
+(void)run{
NSLog(@"类方法人在走!self = %p",self);
}
@end
int main (int argc, const char *argv[])
{
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
//创建对象
Person *p = [Person new];
//使用类调用类方法
[Person test];
[Person run];
//打印对象的地址
NSLog (@"这是创建的对象p = %p", p);
NSLog (@"这是创建的对象p = %p",[p class]);
[pool drain];
return 0;
}
3、访问成员变量
#import <Foundation/Foundation.h>
//方法声明
@interface Dog:NSObject
//实例变量
{
int _speed;
}
//set方法
-(void)setSpeed:(int) speed;
//get方法
-(int)speed;
@end
//方法实现
@implementation Dog
-(void)setSpeed:(int) speed{
//将set的形参speed赋值给_speed
_speed = speed;
}
-(int)speed{
//get方法一定有返回值,返回值是实例变量
return _speed;
}
@end
int main (int argc, const char *argv[])
{
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
//在此处输入Objective-C代码
//创建对象
Dog *d = [Dog new];
//通过set方法设置速度值
[d setSpeed:100];
//打印速度值
NSLog(@"speed = %d",[d speed]);
[pool drain];
return 0;
}
当在set方法中形参名和实例变量名相同时通过set方法给实例变量赋值后不能获得想要的值
#import <Foundation/Foundation.h>
//方法声明
@interface Dog:NSObject
//实例变量
{
int speed;
}
//set方法
-(void)setSpeed:(int) speed;
//get方法
-(int)speed;
@end
//方法实现
@implementation Dog
-(void)setSpeed:(int) speed{
//将set的形参speed赋值给_speed
speed = speed;
}
-(int)speed{
//get方法一定有返回值,返回值是实例变量
return speed;
}
@end
int main (int argc, const char *argv[])
{
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
//在此处输入Objective-C代码
//创建对象
Dog *d = [Dog new];
//通过set方法设置速度值
[d setSpeed:100];
//打印速度值
NSLog(@"speed = %d",[d speed]);
[pool drain];
return 0;
}
当set方法中形参名和成员变量名相同时使用self可以访问到值
#import <Foundation/Foundation.h>
//方法声明
@interface Dog:NSObject
//实例变量
{
int speed;
}
//set方法
-(void)setSpeed:(int) speed;
//get方法
-(int)speed;
@end
//方法实现
@implementation Dog
-(void)setSpeed:(int) speed{
//将set的形参speed赋值给_speed
<strong>self->speed = speed;</strong>
}
-(int)speed{
//get方法一定有返回值,返回值是实例变量
return speed;
}
@end
int main (int argc, const char *argv[])
{
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
//在此处输入Objective-C代码
//创建对象
Dog *d = [Dog new];
//通过set方法设置速度值
[d setSpeed:100];
//打印速度值
NSLog(@"speed = %d",[d speed]);
[pool drain];
return 0;
}
4、self 在内存管理中的特殊使用
三、self使用注意事项及总结
1、谁调用当前方法,self就代表谁
2、self在对象方法中,就代表当前对象
3、如果self在类方法中,就代表当前类
4、如果一个类中同时有类方法和对象方法存在时,self不会调错,因为self所在的位置不同代表的方法也不同