2016-12-04 8 views
0

내가 애플에서이 코드를 발견 한 :@synthesize가 ivars를 만들면 Apple이 ivars를 만드는 이유는 무엇입니까?

@interface TiltShift : CIFilter 
{ 
    CIImage *inputImage; 
    NSNumber *inputRadius; 
} 
@property (retain, nonatomic) CIImage *inputImage; 
@property (copy, nonatomic) NSNumber *inputRadius; 
@end 

@implementation TiltShift 

@synthesize inputImage; 
@synthesize inputRadius; 

애플이 속성을 만들고 동시에 인스턴스 변수를 생성하고이를 합성된다. 제 질문은 애플이 왜 이러는 거죠?

내가 아는 한 Xcode는 @synthesize이 없어도 선언 된 속성에 밑줄이있는 ivars를 만듭니다. 그래서 우리는 _inputImage_inputRadius을 이미 만들었습니다.이 코드가 주어지면 Xcode는 애플이 밑줄없이 ivars에 속성을 연결하려고한다는 것을 어떻게 알 수 있습니까?

단순히 이런 짓을 했을까

:

@interface TiltShift : CIFilter 
{ 
    // CIImage *inputImage; 
    // NSNumber *inputRadius; 
} 
@property (retain, nonatomic) CIImage *inputImage; 
@property (copy, nonatomic) NSNumber *inputRadius; 
@end 

@implementation TiltShift 

// @synthesize inputImage; 
// @synthesize inputRadius; 

을하고 밑줄 인스턴스 변수가 있습니다.

그리고 이것은 단지 애플이 아닙니다. 나는 웹상에서 많은 코드를 보았고, 다른 개발자들로부터 이것을 보았다. 나는 최근의 코드에서 그것을 보았다. 내 의견으로는 이것이 나쁜 코드입니다. 왜냐하면 "실제"ivars와 ivars 사이의 속성을 백업하는 것을 구분하기가 불가능하기 때문입니다.

이와 같은 코드를 만드는 것이 합리적입니까?

+3

아주 오래된 샘플 코드입니다. 이 모든 것은 몇 년 전에 필요 했었습니다. Objective-C는 몇 년 전에 진화하여'@ property' 만 필요하고 다른 것은 만들지 않았습니다. – rmaddy

답변

3

TLDR - 속성 자동 합성 전에 ARC 이전의 오래된 코드입니다. 우리는 2011 이전 (또는 2010?) 코드를 여기에서 말하고 있습니다.

@synthesize은 밑줄을 만들지 않습니다. 속성 이름과 같은 이름의 ivars를 만듭니다.

그래서 이전 코드에서는 @synthesize inputImage = _inputImage;과 같은 것을 사용하여 ivar이 제대로 밑줄을 긋게되었습니다.

현대 자동 합성 (@synthesize을 지정하지 않은 경우)은 밑줄이있는 ivars를 생성합니다.

역사적으로 강조 표시된 변수는 Apple을 위해 예약되었으므로 누구도 사용하지 않아야합니다.

+0

위대한 설명, 감사합니다! – SpaceDog