OC对象中的self,有点像C#中的this。但是又有差异,self可以用来指向当前对象的对象方法,也可以指向当前对象的类方法。而this不能指向C#中的静态方法(类方法)。
self用途:
1、当方法中声明了一个跟类成员变量重名的变量,直接访问成员变量名时,默认优先访问方法内部声明的变量。当想要访问类的成员变量时,就要用self->成员变量名的方式来访问了。
2、谁调用了当前方法,self就代表谁
2.1 self出现在对象方法中,self就代表对象
2.2 self出现在类方法中,self就代表类
3、[self 方法名]可以调用类本身的其他对象方法/类方法
#import <Foundation/Foundation.h>
@interface Dog:NSObject
{
//年龄
int _age;
}
//设置年龄
- (void)setAge:(int)age;
//获得年龄
- (int)age;
//叫方法
- (void)bark;
+ (void)bark;
//跑方法
- (void)run;
+ (void)run;
@end
@implementation Dog
- (void)setAge:(int)age
{
_age=age;
}
- (int)age
{
return _age;
}
//对象方法:叫
- (void)bark
{
//声明方法内部的成员变量,跟类的成员变量同名
int _age=3;
//直接访问_age,优先访问方法内部的成员变量
//NSLog(@"汪汪汪,我今年%d岁了",_age);
//通过self->成员变量名访问类本身的成员变量
NSLog(@"汪汪汪,我今年%d岁了",self->_age);
}
//类方法:叫
+ (void)bark
{
NSLog(@"我是类方法,汪汪汪");
}
//对象方法:跑
- (void)run
{
//通过[self 方法名]调用类本身的其他方法。由于是在对象方法中调用,所以访问的是对象方法bark
[self bark];
NSLog(@"跑跑跑");
}
//类方法:跑
+ (void)run
{
NSLog(@"我是类方法,跑跑跑");
}
@end
int main()
{
Dog *d=[Dog new];
[d setAge:10];
//调用对象方法:叫
[d bark];
//调用对象方法:跑
[d run];
}