문제

아래의 Getter에서 무슨 일이 일어나고 있는지 이해하려고 노력하고 있습니다. 이것이 지금까지 이해하는 것입니다.

(1) getter는 nsstring 객체에 대한 포인터를 반환합니다. (2) NSString 물체가 유지되며, 아마도 우리가 방금 포인터를 포기했기 때문일 수 있습니다. (3) 자동 제대? PlanetClass 인스턴스가 처리 될 때 언제 활성화됩니까?

// CLASS
@interface PlanetClass : NSObject {
        NSString *planetName;
}
- (NSString *)planetName;
- (void)setPlanetName:(NSString *)value;
@end

// GETTER
- (NSString *)planetName{
        return[[planetName retain] autorelease];
}

편집 : 실제 보유 및 나중에 출시의 이유에 대해 더 혼란스러워한다고 생각합니다. 내 이해는 Getter가 단순히 NIL 또는 이미 존재하는 물체에 대한 포인터를 반환했다는 것이 었습니다 (즉, 세터에 의해 설정되었습니다). 나는 우리가 포인터를 제공 할 때 유지를 이해하고 그것을 추적해야한다고 생각합니다. 그러나 우리는 그것을 추적해야합니다. 릴리스는 나중에 NSSTRING 객체를 해제하는 것을 잊어 버린 결과에 불만이 있습니까?

인스턴스 변수 planetname도 내 거래 방법 (아래 참조)에서 릴리스됩니다. 자동 제국은 수영장이 배수 될 때 바로 나중에 동일하게 수행되는 것 같습니다.

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

건배 -기세 -

도움이 되었습니까?

해결책

Objective-C를 속성으로 처리하도록하여 메모리 관리를 관리하기 위해 일부 구현을 정리할 수 있도록하는 것이 좋습니다.

@interface PlanetClass : NSObject {
    NSString* planetName;
}
@property(nonatomic, retain) NSString* planetName;
@end // PlanetClass

@implementation PlanetClass
@synthesize planetName
//... rest of PlanetClass here
@end // PlanetClass

거기 있습니다 풍부한문서 사용 가능 온라인 객관적인 C 속성에 대한 자세한 내용은 및 @synthesize.

메모리 관리 문서

적극 권장합니다 이것은 메모리 관리에 대한 Apple에서 읽습니다 모든 것이 무엇인지 이해하려고 노력합니다 retain/release Hubbub에 관한 것입니다.

다른 팁

autoreLease가 객체로 전송되면 AutorELEASE 풀에 추가됩니다. 수영장이 배수되면 수영장의 모든 물체에 릴리스를 보냅니다. 따라서 풀이 배수되면 자동 제비 풀의 모든 물체가 해제됩니다.

getter 메소드의 반품/자동 제출은 아무것도하지 않습니다. planetName

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top