2012-08-04 4 views
0

3 가지 크기가있는 퍼즐 게임을 제작 중입니다. 로드 된 이미지는 퍼즐의 크기에 따라 다릅니다. 간단히하기 위해 나는 그것들을 작은/중간/큰이라고 부를 것이다. 내 뷰를로드 할 때 퍼즐의 크기를 말하고 loadImages 메서드를 호출합니다. 자동 렌더링 된 개체 다시 할당

@property (nonatomic, retain) UIImage *solidSquare; 

그래서 내 loadImages 방법에 내가 가진 :

self.solidSquare = [[[UIImage alloc] initWithContentsOfFile:solidPath] autorelease]; 

solidPath 동적 퍼즐 크기에 따라 결정된다

나는이처럼 설정되어 속성을 가지고있다.

이제 사용자가 다른 퍼즐 크기로 전환하면 게임이 시작될 때 loadImages가 다시 호출됩니다. 이 메모리 상황을 어떻게 처리합니까? 내 loadImages 메소드의 처음에 이것을 호출해야한다고 생각합니다.

[self.solidSquare release]; 

마? 로드 된 것이 처음인지 여부를 평가하려면 어떻게해야합니까?

답변

6

아니요, 그렇지 않거나 충돌합니다. 객체가 자동으로 릴리즈되기 때문에 참조를 더 이상 걱정할 필요가 없습니다. 포인터가 매달리지 않고 메모리가 누출되지 않습니다. 또한 속성을 사용할 때 속성 설정자는 이전 개체가 자동으로 해제되도록합니다.

전체적으로 속성을 안전하게 재 할당 할 수 있습니다.

편집 :하지만 을 수행 할 경우을 -dealloc에서 nil으로 설정해야합니다.

+0

질문을 읽었을 때 이미 답변을 게시했습니다. autorelease가 무엇을 의미하는지, 특히 그 속성이 retain/release를 처리한다는 것을 설명하기 위해 +1. 그러나 '보유'/ '강한'속성이라는 것을 언급하고 싶을 수도 있습니다.이 경우 마법을 사용합니다. – ATaylor

+0

그래서 내보기가 dealloc'd 때 그것을 풀어 필요가 없습니다? 나는 그것이 합리적이라고 생각한다. 재 할당 된 경우 오래된 객체를 릴리스한다는 것을 알지 못했습니다. 이것을 수동으로 관리하고 싶다면 solidSquare == nil인지 평가해야합니까? 그렇다면 그것을 할당하기 전에 해제해야합니까? – JamesB41

+0

@ JamesB41 당신은 그것을 dealloc에서'nil'으로 설정해야합니다. 업데이트를 참조하십시오. –

0

autorelease를 호출하면 autorelease 풀에 개체가 추가되므로 명시 적으로 해제 할 필요가 없습니다. 객체가 릴리즈 될 때를 제어하고 싶다면 autorelease를 호출하지 말고 객체가 적당한 위치에 놓아 두지 마십시오.

+0

dealloc 외부에서 명시 적으로 속성을 해제해서는 안되며 backing ivar를 사용하면됩니다. 항상 속성 setter를 사용하고 nil을 지정하십시오. – logancautrell

+0

나는 그것을 결코 이해하지 못했다. 원래 개체는 절대로 출시되지 않았으므로 포인터를 nil로 설정했기 때문에 메모리를 해제 할 수있는 방법이 없습니다 (자동 릴리스가 아니면) –

+0

@JohnCorbett 개체는 절대로 릴리스되지 않지만 자동으로 해제되었습니다. –