Objective-C의 instancetype 및 id 키워드

4491 단어 iOS기초 지식

1.instancetype이란?


instancetype은 clang 3.5에서 시작합니다. clang이 제공하는 키워드는 어떤 방법이 되돌아오는 알 수 없는 형식의 Objective-C 대상을 표시합니다.알 수 없는 유형의 대상은 id 키워드로 표시할 수 있다는 것을 알고 있습니다. 그런데 왜 instance type이 하나 더 있습니까?

2. 연결 반환 유형(related result types)


Cocoa의 명명 규칙에 따라 다음 규칙을 충족합니다.
  • 클래스 방법 중 alloc 또는 new로 시작
  • 실례 방법 중autorelease,init,retain 또는self로 시작
  • 방법은 하나의 방법이 있는 유형의 대상을 되돌려줍니다. 이런 방법은 관련 귀환 유형의 방법이라고 부릅니다.다시 말하면 이 방법들의 귀환 결과는 방법이 있는 종류를 유형으로 한다.예를 들면 다음과 같습니다.
    @interface NSObject
    + (id)alloc;
    - (id)init;
    @end
    
    @interface NSArray : NSObject
    @end

    다음과 같은 방법으로 초기화NSArray할 경우
    NSArray *array = [[NSArray alloc] init];

    코코아의 명명 규칙에 따르면 문장[NSArray alloc]의 유형은 NSArray*이다.alloc의 반환 형식은 관련 반환 형식에 속하기 때문이다.마찬가지로 [[NSArray alloc] init]의 귀환 결과도NSArray*였다.

    3. instancetype 역할


    3.1 역할


    연관 반환 유형이 아닌 방법은 다음과 같습니다.
    @interface NSArray
    + (id)constructAnArray;
    @end

    NSArray를 다음과 같이 초기화할 때
    [NSArray constructAnArray];

    코코아의 방법명명명규범에 따르면 반환 유형은 방법성명의 반환 유형과 같다id.그러나 instancetype를 반환 유형으로 사용하는 경우 다음과 같습니다.
    @interface NSArray
    + (instancetype)constructAnArray;
    @end

    동일한 방식으로 NSArray를 초기화하는 경우
    [NSArray constructAnArray];

    얻은 반환 유형과 방법이 있는 유형의 유형은 같다NSArray*!총괄적으로 말하자면instancetype의 역할은 바로 비연관 귀환 유형의 방법을 해당 유형의 유형으로 귀환시키는 것이다!

    3.2 이점


    대상의 유형을 정할 수 있고 컴파일러가 우리의 코드 작성 문제를 더욱 잘 파악할 수 있도록 도와줄 수 있다. 예를 들어 다음과 같다.
    [[[NSArray alloc] init] mediaPlaybackAllowsAirPlay]; //  "No visible @interface for `NSArray` declares the selector `mediaPlaybackAllowsAirPlay`"
    
    [[NSArray array] mediaPlaybackAllowsAirPlay]; // (No error)

    상례에서 첫 번째 줄 코드는 [[NSArray alloc] init]의 결과NSArray*였기 때문에 컴파일러는 되돌아오는 데이터 형식에 따라 NSArray의 실현 여부mediaPlaybackAllowsAirPlay 방법을 검출할 수 있다.개발자가 컴파일 단계에서 오류를 발견하는 데 유리하다.두 번째 줄 코드는 array가 관련 반환 유형 방법에 속하지 않기 때문에 [NSArray array] 반환된 것은 id 유형이고 컴파일러는 id 유형의 대상이 실현되었는지 mediaPlaybackAllowsAirPlay 방법을 모르기 때문에 개발자를 대신해서 오류를 신속하게 발견할 수 없다.

    4. instancetype과 id의 공통점

  • 동일점
  • 차이점
  • instancetype는 방법이 있는 클래스와 같은 유형의 대상을 되돌릴 수 있고id는 미지의 유형의 대상만 되돌릴 수 있다.
  • instancetype는 반환값으로만 사용할 수 있고 id처럼 매개 변수로 사용할 수 없다. 예를 들어 아래의 문법:
  • //err,expected a type
    - (void)setValue:(instancetype)value
    {
        //do something
    }

    틀린 것이니 다음과 같이 써야 한다.
    - (void)setValue:(id)value
    {
        //do something
    }

    출처: Objective-C의 instancetype 및 id 키워드
    영문 링크: 1.http://clang.llvm.org/docs/LanguageExtensions.html#objective-c-features 2. http://nshipster.com/instancetype/

    좋은 웹페이지 즐겨찾기