2013-07-10 2 views
0

어쩌면 너무 오래 작동하지만이 문제가 발생했을 수 있습니다 ... 추상화를 시도해 보겠습니다. 실제 이름은 중요하지 않습니다.개체 할당 해제가 작동하지 않습니다

나는 사람들은 dynamicaly 및 activeCar를 저장하는 객체 내가 작성, 나는 볼보에 대한 속성을했습니다 내 게임 클래스에서

@property (nonatomic, strong) Volvo *volvo; 
@property (nonatomic, strong) BMW *bmw; 
@property (nonatomic, strong) Car *activeCar; 

BMW를 수퍼 클래스에서 상속 20+ 클래스, 자동차

@interface Car : NSObject; 
@interface Volvo : Car; 
@interface BMW : Car; etc... 

를했습니다 in property activeCar

_bmw = [[BMW alloc] init];  
_activeCar = _bmw; 

이제 재시작 방법에서 나는 능동 차가되고 싶다. b 두 로그 모두 동일한 주소를 가리키고 있지만 로그에서 wokring은 아닙니다.

_activeCar = nil; // dealloc on BMW and Car is not called 
// _bmw = nil; // dealloc is called properly on BMW and Car class 

어떻게 관리 할 수 ​​있습니까? 이것이 유일한 해결책입니까?

if ([_activeGame isKindOfClass:[BMW class]]) 
_bmw = nil; 
+0

귀하의 앱이 이상하게 모델링되었다고 생각합니다. 왜 자동차 브랜드는 Car 클래스 인스턴스의 또 다른 속성이 아닌가? – bbum

+0

저는 실제 앱에서 자동차를 사용하지 않습니다. 상속을 설명하기위한 것입니다. 어쨌든, bmw와 volvo는 특정 메소드, 속성 등을 가진 새로운 클래스가 아니라 이름입니다. – alexhajdu

+0

일반적으로 'isKindOfClass :'를 많이 사용하면 코드 냄새가납니다. 응용 프로그램의 아키텍처가 매우 불안정하다는 것을 나타냅니다. 그러한 내성을 시도하고 제거하기 위해 디자인을 재고하는 것이 좋습니다. – bbum

답변

2

만일 당신이 activeCar를 파괴 할 때 BMW를 파괴하고 싶어하면, BMW를 어쨌든 ivar로 유지하는 것에는 아무런 의미가 없다.

_activeCar = [[BMW alloc] init]; 

현재 구현에서는 self.bmw에 여전히 참조가 있으므로 BMW를 제외하지 않습니다.

+0

하하, 물론 : D – alexhajdu

2

귀하의 activeCar 당신이 그것을 참조 2 개 strong 특성을 가지고 있기 때문에 실제로 항상 두 번 유지됩니다. 따라서 activeCar을 없앨 수는 있지만 다른 속성은 계속 설정됩니다.

activeCar이 된 후에 차를 원하지 않으면 activeCar으로 설정 한 후 다른 참조를 곧바로 맺을 수 있습니다.

+0

좋은 생각입니다. activeCar를 weak로 설정하는 것과 같은 다른 해결책이 있습니까? – alexhajdu

+0

당신은'weak'으로 설정할 수 있습니다 만, 그때는 아무런 효과가 없으므로 (release point of view) 클래스의 체크와 같이 강제되지 않게 될 것입니다. – Wain

+0

감사합니다. 첫 번째 솔루션은 완벽하게 작동합니다. – alexhajdu

관련 문제