oc中的self和super
@implementation Son : Father - (id)init { self = [super init]; if (self) { } return self; }
在动态方法中,self代表着"对象";在静态方法中,self代表着"类",self始终代表着当前方法的调用者
self是类的隐藏的参数变量,指向当前调用方法的对象(类也是对象,类对象),另一个隐藏参数是_cmd,代表当前类方法的selector。
如打印当前要调用的方法
- (void)viewDidLoad { [super viewDidLoad]; NSLog(@"Current method: %@ %@",[self class],NSStringFromSelector(_cmd)); }
super并不是隐藏的参数,它只是一个"编译器指示符"
#import <Foundation/Foundation.h> @interface Person:NSObject { NSString* name; } - (void) setName:(NSString*) yourName; @end @implementation Person - (void)setName:(NSString *)yourName { name = yourName; } @end @interface PersonMe:Person { NSUInteger age; } - (void) setAge:(NSUInteger)yourage; - (void) setName:(NSString*) yourName andAge:(NSUInteger)yourage; @end @implementation PersonMe - (void)setAge:(NSUInteger)yourage { age = yourage; } - (void) setName:(NSString*) yourName andAge:(NSUInteger)yourage { [self setAge:age]; [super setName:yourName]; NSLog(@"self ' class is %@", [self class]); NSLog(@"super' class is %@", [super class]); } @end int main (int argc, const char * argv[]) { @autoreleasepool { // insert code here... PersonMe* me = [[PersonMe alloc] init]; [me setName:@"abc" andAge:18]; [me release]; } return 0; } </span></span>
结果为:
self 's class is PersonMe
super ' s class is PersonMe
super和 self 指向的是相同的消息接收者,拿上面的代码为例,不论是用 [self setName] 还是 [super setName],接收“setName”这个消息的接收者都是 PersonMe* me 这个对象。不同的是,super 告诉编译器,当调用 setName 的方法时,要去调用父类的方法,而不是本类里的。
ps:当使用 self 调用方法时,会从当前类的方法列表中开始找,如果没有,就从父类中再找;而当使用 super 时,会从super出现的在的方法所在的类的父类开始查找。