iOS[OC] 기본편의 instancetype과 id 차이

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

一、关联返回类型(related result types)


코코아의 명칭 규칙에 따라 다음과 같은 규칙을 만족시키는 방법: 1. 클래스 방법에서alloc 또는 new로 시작하여 2. 실례적인 방법에서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입니다.

2. instancetype 작용


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

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

코코아의 방법 명명 규범에 따라 되돌아오는 형식은 방법이 설명하는 되돌아오는 형식과 같이 id입니다.그러나 instancetype을 반환 유형으로 사용하는 경우 다음과 같습니다.
@interface NSArray  
+ (instancetype)constructAnArray;  
@end  

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

반환 유형은 NSArray*
총괄적으로 말하면 instance type의 역할은 비연관 귀환 유형의 방법으로 해당 유형의 유형을 귀환시키는 것이다!
2. 이점
대상의 유형을 정할 수 있고 컴파일러가 우리의 코드 작성 문제를 더욱 잘 파악할 수 있도록 도와줄 수 있다. 예를 들어 다음과 같다.
[[[NSArray alloc] init] mediaPlaybackAllowsAirPlay]; //  "No visible @interface for `NSArray` declares the selector `mediaPlaybackAllowsAirPlay`"  
  
[[NSArray array] mediaPlaybackAllowsAirPlay]; // (No error)  

상례의 첫 번째 행 코드는 [[NSArray alloc] init]의 결과가 NSArray*이기 때문에 컴파일러는 되돌아오는 데이터 형식에 따라 NSArray가 미디어플레이백 AllowsAirPlay 방법을 실현하는지 확인할 수 있다.개발자가 컴파일 단계에서 오류를 발견하는 데 유리하다.두 번째 줄 코드는 array가 관련 반환 유형 방법에 속하지 않기 때문에 [NSArray array]는 id 유형을 반환한다. 컴파일러는 id 유형의 대상이 미디어플레이백 Allows AirPlay 방법을 실현했는지 모르고 개발자를 대신해서 오류를 신속하게 발견하지 못한다.

3. instancetype과 id의 공통점과 차이점


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

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

좋은 웹페이지 즐겨찾기