Day3 oc中的self跟super
Day3 oc中的self和super
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出现的在的方法所在的类的父类开始查找。