1
다른

에 출시 :목표 - C : 하나 개의 스레드에 할당하고 내 메인 스레드에서이 일을하고

CCAnimation *anim; //class variable 

[NSThread detachNewThreadSelector:@selector(loadAimation) toTarget:self withObject:nil]; 

loadAimation에서 :

-(void) loadAnimation { 
    NSAutoreleasePool *autoreleasepool = [[NSAutoreleasePool alloc] init]; 
     anim = [[CCAnimaton alloc] init]; 
     [autoreleasepool drain]; 
} 

을 그리고 메인 스레드에서 내가 그것을 해제 :

 [anim release]; 

이제 메모리 관리와 관련하여 문제가 없는지 묻고 싶습니다.

+0

'loadAimation'은 (는)'loadAnimation'입니까? 왜'anim'은 속성이 아닌 클래스 변수입니까? 이 릴리스의 코드는 무엇입니까? 객체 생성과 파기가 균형이 잘 이루어 졌는지 알 수있는 충분한 정보가 없습니다. – outis

+0

네, 맞습니다. 문제가 정말로 릴리스 주위에서 일어나는 것 같아요. (이게 괜찮은지 물어보고 싶었을뿐입니다). 실제로 그것은 cocos2d와 관련이 있습니다. 릴리즈 전 CCAction을 만들고 CCSprite * sp를 가지고 있습니다. [sp runAction : anim]; 애니메이션이 실행되는 동안 시각적으로 애니메이션에는 아무 일도 일어나지 않지만 그것을 풀어주는 것이 맞습니까? – Asymptote

+0

모든 것이 어떻게 구현되는지에 따라 다릅니다. 소유권을 갖는 모든 객체는 애니메이션을 유지합니다. 객체가 소유권을 갖지 않으면 애니메이션을 유지하지 않습니다. 소유권 규칙에 대해 cocos2d 문서를 확인하십시오. 그럼에도 불구하고 메모리 관리 문제를 일으키는 [경쟁 조건] (http://en.wikipedia.org/wiki/Race_condition)을 실행할 수 있습니다 (예 : 소유 객체가 메모리를 유지하기 전에 한 스레드에서 애니메이션이 릴리스 됨) 다른 스레드). – outis

답변

0

물론 포인터 변수에 대한 액세스를 보호하는 것이 좋습니다.

1

한 스레드에서 객체를 할당하고 다른 스레드에서 할당을 해제 할 수 있습니다. 그러나 어떻게 접근 하느냐에 따라 코드가 잘못 처리 할 수 ​​있습니다.

가능하면 anim을 속성으로 설정하면 메모리 관리에 대해 크게 걱정할 필요가 없습니다. 그렇게 할 수 없다면 접근 자 패턴을 적용 할 수 있지만 직접 구현해야합니다.

static CCAnimation *anim=nil; 

+(CCAnimation*)anim { 
    @synchronized(self) { 
     return [[anim retain] autorelease]; 
    } 
} 
+(void)setAnim:(CCAnimation*)animation { 
    @synchronized(self) { 
     if (anim != animation) { 
      [anim release]; 
      anim = [animation retain]; 
     } 
    } 
} 
-(void)loadAnimation { 
    NSAutoreleasePool *autoreleasepool = [[NSAutoreleasePool alloc] init]; 
    [[self class] setAnim:[[[CCAnimaton alloc] init] autorelease]]; 
    [autoreleasepool drain]; 
} 
+0

표준 setter/getter를 구현하기 위해 @synchronize (self)하지 마십시오. @property()와 @synthesize를 사용하십시오. 결과는 더 빠르며 정확함을 보장합니다 (위의 내용은 잘못된 것은 아니지만 컴파일러가 작성할 수있는 코드를 작성하는 이유는 무엇입니까?). – bbum

+0

@bbum : 이것들은 표준 접근자가 아니고'anim'은 (인스턴스) 속성이 아니기 때문에. 메소드 앞에'+'를 적어 둡니다. 'anim'은 Apple의 컴파일러가 생성하지 못하는 클래스 속성입니다 (하지만 도트 구문을 지원하는 것으로 보입니다). getter와 setter에서'@ synchronize '는 멀티 스레딩을 처리 할 때 매우 필요합니다. – outis

+0

Derp. 죄송합니다. '+'를 놓쳤습니다. 반환 방법이 잘못되었습니다. 만약 당신이 제대로 원 자성을 원한다면''anim'' autorelease''를 리턴해야합니다''로컬 스레드에서''anim''의 수명이 정확한 의미를 따르도록 보장해야합니다 (사실, @synthesize는 w/인스턴스의 경우 표준 접근 자). – bbum