iOS Runtime 면접 문제(코드 문제2)

2146 단어

제목2: 다음 코드는 어떤 결과를 출력합니까?

@interface Sark : NSObject
@end
@implementation Sark
@end

int main(int argc, const char * argv[]) {
    @autoreleasepool {
        // insert code here...

        NSLog(@"%@", [NSObject class]);
        NSLog(@"%@", [Sark class]);

        BOOL res1 = [(id)[NSObject class] isKindOfClass:[NSObject class]];
        BOOL res2 = [(id)[NSObject class] isMemberOfClass:[NSObject class]];
        BOOL res3 = [(id)[Sark class] isKindOfClass:[Sark class]];
        BOOL res4 = [(id)[Sark class] isMemberOfClass:[Sark class]];
        NSLog(@"%d--%d--%d--%d", res1, res2, res3, res4);
    }
    return 0;
}

결과: 1--0--0-0
분석:
우선, 우리는 먼저 문제에서 두 가지 방법의 원본 코드를 살펴보자.
- (BOOL)isMemberOfClass:(Class)cls {
    return [self class] == cls;
}

- (BOOL)isKindOfClass:(Class)cls {
    for (Class tcls = [self class]; tcls; tcls = tcls->superclass) {
        if (tcls == cls) return YES;
    }
    return NO;
}

다음을 확인할 수 있습니다.
  • isKind OfClass의 집행 과정은 자신의 isa 바늘을 가져와 자신과 비교하고 그렇지 않으면 계속 isa 바늘이 가리키는 슈퍼 클래스를 가져와 비교한다.이렇게 순환한다.
  • isMember OfClass는 자신의 isa 지침을 받아서 자신과 비교하는 것이다. 같은지 아닌지.
  • [NSObject class]가 실행된 후에 isKind Ofclass를 호출하여 처음으로 NSObject와 NSObject의 metaclass가 같은지 판단했다. 앞서 metaclass를 이야기할 때 상세한 그림을 놓았는데 그림에서 알 수 있듯이 NSObject의 metaclass는 그 자체와 다르다.이어 두 번째 순환으로 NSObject와 meta class의 슈퍼 class가 동일한지 판단한다.아니면 그 그림에서 볼 수 있듯이 Root class(meta)의 슈퍼 클래스는 바로 Root class(class), 즉 NSObject 자체이다.그래서 두 번째 순환이 같기 때문에 첫 줄의res1 출력은 YES가 되어야 한다.
  • 이사는 NSObject의 메타 클래스를 가리키기 때문에 NSObject 클래스와 다르다.
  • [Sark class]가 실행된 후에 isKind OfClass를 호출했다. 첫 번째 for 순환, Sark의 Meta Class는 [Sark class]와 같지 않다. 두 번째 for 순환, Sark Meta Class의 슈퍼 class는 NSObject Meta Class를 가리키는데 Sark Class와 같지 않다.세 번째 for 순환에서 NSObject Meta Class의 슈퍼 클래스는 NSObject Class를 가리키는데 Sark Class와 다르다.네 번째 순환에서 NSObject Class의 슈퍼 클래스는 nil을 가리키며 Sark Class와 같지 않습니다.네 번째 순환 후에 순환을 종료하기 때문에 세 번째 줄의res3 출력은 NO입니다.
  • 이사가 Sark의 Meta Class를 가리키는데 Sark Class와도 다르다.

  • 열문 추천


    2019 온사이트 iOS 면접문제 및 답안 요약!

    좋은 웹페이지 즐겨찾기