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出现的在的方法所在的类的父类开始查找。

猜你喜欢

转载自magicbird.iteye.com/blog/2279475