Day3 oc의 self 및 super

2454 단어

oc의 self와 슈퍼


 
@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의 대상이다.다른 것은 슈퍼가 컴파일러에게 setName 방법을 호출할 때, 이 클래스가 아닌 부모 클래스를 호출해야 한다고 알려 준다.
ps:self 호출 방법을 사용할 때 현재 클래스의 방법 목록에서부터 찾고 없으면 부모 클래스에서 다시 찾습니다.슈퍼를 사용할 때 슈퍼가 나타나는 방법이 있는 클래스의 부류부터 찾습니다.

좋은 웹페이지 즐겨찾기