2011-07-06 3 views
5

참고 일반적으로이 예에 도시 된 것처럼, (오히려 set 접근을 호출하고 nilas에게 매개 변수를 전달 이하) 직접 객체 인스턴스 변수를 해제해야 dealloc 방법 :현대 런타임이란 무엇입니까?

- (void)dealloc { 
    [property release]; 
    [super dealloc]; 
} 

사용하는 경우 현대 런타임 및 인스턴스 변수를 합성하지만, 직접 인스턴스 변수에 액세스 할 수 없습니다, 그래서 당신은 접근 자 메서드를 호출해야합니다

- (void)dealloc { 
    [self setProperty:nil]; 
    [super dealloc]; 
} 

정확히 아이폰 OS 응용 프로그램 개발에 현대적인 런타임은 무엇입니까?

+0

아마도 관련 : http://stackoverflow.com/questions/5621139/is-there-any-problem-using-self-property-nil-in-dealloc –

+0

해당 게시물에는 "modern 실행 시간". – Pablo

+2

'인스턴스 변수에 직접 액세스 할 수 없습니다'라는 말은 이전 컴파일러의 경우였습니다. 최신의 충분한 컴파일러를 사용하면 선언 된 속성에 대해 자동으로 합성 된 백업 인스턴스 변수에 액세스 할 수 있습니다. –

답변

10

합성 된 속성과 동일한 이름으로 직접 ivar에 액세스 할 수 있습니다. @synthesize 지시문은 사용자를 대신하여 ivar를 만듭니다. 컴파일러 지시어이므로 ivar을 컴파일 할 때 사용할 수 있습니다. Objective-C 프로그래밍 언어의 선언 된 속성 장에서 "Runtime Difference"을 참조하십시오. Abizern이 의견에 언급했듯이, ivar에 대해 원하는 이름을 지정할 수도 있습니다. @synthesize coffee=tea; - 여기서 tea은 ivar이고 coffee 속성입니다.

ivar을 사용하려면 점 구문을 사용하지 않고 다른 변수와 마찬가지로이를 참조하십시오. 다음은 모두 완벽하게 합법적이고 예상대로 작동합니다

@interface Grisby : NSObject {} 
@property (retain) NSObject * obj; 
@end 

@implementation Grisby 

@synthesize obj; 

- (void) dealloc { 
    [obj release], obj = nil; 
    [super dealloc]; 
} 

- (id) init { 
    self = [super init]; 
    if(!self) return nil; 

    obj = [NSObject new]; 

    return self; 
} 

- (NSObject *) obj { 
    return [[obj retain] autorelease]; 
} 

@end 

은 "현대 런타임은"64 비트로의 전환의 일환으로 맥 OS X 10.5 (레오파드)에 소개되었다. iOS의 모든 버전은 최신 런타임을 사용합니다. 합성 된 인스턴스 변수는 위에 제공된 링크에서 언급했듯이 현대 런타임의 기능입니다.

Objective-C 런타임 프로그래밍 안내서의 다른 주요 차이점 인 noted in "Runtime Versions and Platforms"은 인스턴스 변수가 "깨지기 쉽다"는 것입니다. 클래스가 파생 된 클래스의 저장소에 영향을 미치지 않고 변수를 추가 할 수 있도록하는 ivar 저장소 및 액세스에 간접 지정 계층이 추가되었습니다. 그것은 또한 아마도 인스턴스 변수 합성을 용이하게합니다. Greg Parker has an explanation (새끼 고양이 포함), Mike Ash의 2009 runtime writeup에 대한 참조가 있고 Bavarious의 SO에는 ivar 저장소 및 클래스 확장에 대한 swell post이 있습니다.

Objective-C 런타임 참조의 "Mac OS X Version 10.5 Delta" 장에서 설명없이 변경된 사항을 볼 수 있습니다.

+0

참으로. @ synthesize에있는 iVar의 이름을 바꿀 수도 있습니다. – Abizern

+1

"선언 된 속성은 현대 런타임의 기능입니다"는 사실이 아닙니다. 합성 ivars는 현대 런타임의 기능이지만 OS X의 32 비트 및 64 비트 모두에서 선언 된 속성을 사용할 수 있습니다. 이는 두 런타임을 모두 의미합니다. –

+0

@BJ Homer : 그 주셔서 감사합니다. 이것은 MR과 동시에 ObjC-2.0 및 Leopard에서 소개되는 "현대 런타임"주변의 혼동 중 일부라고 생각합니다. –

관련 문제