——黑马程序员——OC中self和super关键字的使用

-----------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所在的位置不同代表的方法也不同

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值