self 只能在类中使用,离开类之后没有任何意义
- 如果self在对象方法中,那么self就代表调用当前对象方法的那个对象
- 如果self在类方法中,那么self就代表调用当前类方法的那个类
- 我们只需要关注self在哪一个方法中,如果在类方法那么就代表当前类,如果在对象方法那么就代表当前调用该方法的对象
注意点
self会自动区分类方法和对象方法,如果在类方法中使用self调用对象方法,那么会直接报错
不能在对象方法或者类方法中利用self调用当前self所在的方法,会死循环
使用场景
可以在对象方法之间进行相互调用
可以在类方法之间进行相互调用
可以用于区分成员变量和局部变量同名的情况
#import <Foundation/Foundation.h>
@interface Person:NSObject
{
NSString *_name;
int _age;
}
-(void)setName:(NSString *)name;
-(NSString *)name;
// 年龄+1
-(void)addAge;
// 一年后
-(void)yearAfter;
// 输出个人信息
-(void)printInfo;
@end
@implementation Person
-(void)setName:(NSString *)name {
self->_name = name;
}
-(NSString *)name {
return self->_name;
}
// 年龄+1
-(void)addAge{
self->_age++;
}
// 一年后
-(void)yearAfter{
NSLog(@"时间过去一年, 年龄增加一岁");
[self addAge]; // self 在对象方法中,self表示调用当前对象方法的对象
}
// 输出个人信息
-(void)printInfo{
NSLog(@"%@ 当前%i岁", self->_name, self->_age);
}
@end
int main(int argc, const char * argv[]) {
Person *p = [Person new];
[p setName:@"张三"];
[p printInfo]; // 张三 当前0岁
[p yearAfter]; // 时间过去一年, 年龄增加一岁
[p printInfo]; // 张三 当前1岁
return 0;
}