2012-05-27 3 views
2

내 "connect4"스타일 게임에서 배열에 7x6 격자를 나타내는 배열이 있습니다. 배열의 각 "셀"에는 NSNull 또는 UIView 하위 클래스 'CoinView'가 포함됩니다. NSMutableArray 및 기본 뷰에서 객체를 제거하는 올바른 방법은 다음과 같습니다.보기 및 배열에서 개체를 올바르게 제거 하시겠습니까?

- (IBAction)debugOrigin:(id)sender { 
    int x = 0; 
    int y = 0; 
    //get the coin object form the grid 
    CoinView *coin = [[grid objectAtIndex:x] objectAtIndex:y]; 

    //cancel if there's no coin there 
    if ([coin isKindOfClass:[NSNull class]]) { return; } 

    //remove the coin from memory 
    [coin removeFromSuperview]; 
    coin = nil; 
    [[grid objectAtIndex:x] setObject:[NSNull null] atIndex:y]; //will this leak? 

} 

고마워요!

+1

ARC를 사용하는 경우 문제가되지 않습니다. [array setObject : atIndex]를 사용하면 배열에서 이전 객체를 제거하여 자동으로 뒤에서 객체를 해제합니다. 코인뷰가 다른 곳에서 개최된다면, 여전히 존재할 것입니다. 그러나 그 본성 상, 뭔가가 여전히 그것을 참조하고 있기 때문에 누설이 아닙니다. – CrimsonDiego

답변

3

코드가 누출되지 않으며 실제로 (거의) 맞습니다. 코드에서 메모리를 처리하지 않는로

당신은이 댓글을 제거해야합니다 (그리고 코드가 정말 무엇을 당신을 혼란 끝낼 수) :

//remove the coin from memory 

를 다음 줄에서는 '그 수퍼에서 지역 변수 "동전"에 의해 참조 뷰를 제거 다시 :

[coin removeFromSuperview]; 

그리고 당신은 그것이 나중에 코드에서 사용하지 않는 것 확인하는 것이 좋습니다 지역 변수 동전에 전무를 할당 :

NSMutableArray에 대해서는 setObject:AtIndex:이 없습니다. 대신 replaceObjectAtIndex:withObject:를 사용

[[grid objectAtIndex:x] replaceObjectAtIndex:y withObject:[NSNull null]]; //will this leak? 

를 마지막 참고로, 난 당신 (애플의 개발자 문서에서) memory managementmemory leaks에 비트를 읽어 보시기 바랍니다. 첫 번째는 메모리 관리를 훨씬 쉽게 이해할 수 있도록 몇 가지 힌트와 팁을 제공합니다.

+2

텍스트 내에 코드를 배치 할 때 백틱 (\')으로 구분하고, 별표가 아닙니다. 그렇게하면 모노 스페이스로 읽고 쉽게 읽을 수 있습니다. 기울임 꼴은 아닙니다. – Greg

+0

완료, 힌트를 주셔서 감사합니다. – diegoreymendez

관련 문제