2014-11-20 1 views
0

스프라이트 키트에서 SKScene이 할당을 해제하지 않는 이유를 알아 냈습니다. 결국 대답에 한걸음 더 가까이 다가갔습니다. SKAction 블록을 completion 블록으로 많이 사용합니다. . 나는 약한 참조를 사용해야한다는 것을 배웠다.__weak으로 누출 피하기

어떻게 제대로 할 수 있습니까? 블록 내부의 모든은 약합니까?

__weak typeof(self.heli) weakheli = self.heli; 

    [weakheli runAction:[SKAction fadeAlphaTo:1.0f duration:1.0f] completion:^{ 
      ghostMode = NO; 
    }]; 

것은 내가 또한 __weak typeof(ghoseMode) weakGhostMode = ghostMode 성명을 만 블록 내부 weakGhostMode을 변경해야합니까 예를 들어, 난 그냥 최근에 내 블록 중 하나는 다음과 같이 변경? 또 다른 예로서

는해야한다 : 도움을

[weakSelf runAction:[SKAction waitForDuration:.1f] completion:^{ 
    if (mgFiring) { 
     [weakSelf fireMG]; 
    } 
}]; 

감사 :

[weakSelf runAction:[SKAction waitForDuration:.1f] completion:^{ 
    if (mgFiring) { 
     [self fireMG]; 
    } 
}]; 

로 변경 될! 튜토리얼을 통해 Sprite Kit를 배울 때 강한 참조가있는 completion 블록을 사용하는 것에 대해서는 경고하지 않았습니다.

+0

'SKScene'이 (가) 출시되지 않는 것을 어떻게 알 수 있습니까? Instruments에서 게임을 테스트 했습니까? – 0x141E

+1

@ 0x141E 예를 들어, 저는 장비로 테스트했고, 새로운 게임 장면을 시작할 때마다 메모리가 올라가고 절대로 다시 돌아 오지 않습니다. 둘째,'SKScene'의'dealloc' 메서드를'NSLog'했는데 결코 호출되지 않습니다. – Todd

+0

제공 한 코드에서 'SKScene'을 유지할 수있는 내용이 표시되지 않습니다. – 0x141E

답변

1

heli 개체가 동작을 실행하는 데 사용되므로 __weak가 필요하지 않으므로 블록 내에서으로 참조되지 않습니다.

__weak typeof(self.heli) weakheli = self.heli; 

[weakheli runAction:[SKAction fadeAlphaTo:1.0f duration:1.0f] completion:^{ 
     ghostMode = NO; 
}]; 

그래서이 잘 될 것입니다 :

[self.heli runAction:[SKAction fadeAlphaTo:1.0f duration:1.0f] completion:^{ 
     ghostMode = NO; 
}]; 

같은이 간다 :

[weakSelf runAction:[SKAction waitForDuration:.1f] completion:^{ 
    if (mgFiring) { 
     [weakSelf fireMG]; 
    } 
}]; 

그것은해야 다음 weakSelf 만 필요

[self runAction:[SKAction waitForDuration:.1f] completion:^{ 
    if (mgFiring) { 
     [weakSelf fireMG]; 
    } 
}]; 

(있는 경우 전혀).

+0

약한 버전의 ghostMode가 필요하지 않은 이유는 무엇입니까? – Todd

+0

또한 약한 변수를 사용하여 액션을 호출 할 수 있습니까? 나는 벌써 들어가서 그 중 130 명을 바꾸었다. – Todd

+0

유령 모드가 부울입니까? 그것은 약할 수 없으며, 그것은 대상이 아닙니다. – LearnCocos2D