7
+(void)setup { 
    UIImage* spriteSheet = [UIImage imageNamed:@"mySpriteSheet.png"]; 
    CGRect rect; 
    animation = [NSMutableArray arrayWithCapacity:numberOfFramesInSpriteSheet]; 
    int frameCount = 0; 

    for (int row = 0; row < numberFrameRowsInSpriteSheet; row++) { 
     for (int col = 0; col < numberFrameColsInSpriteSheet; col++) { 
      frameCount++; 
      if (frameCount <= numberOfFramesInSpriteSheet) { 
       rect = CGRectMake(col*frameHeight, row*frameWidth, frameHeight, frameWidth); 
       [animation addObject:[UIImage imageWithCGImage:CGImageCreateWithImageInRect(spriteSheet.CGImage, rect)] ]; 
      } 
     } 
    } 
} 

ARC를 사용하는 상태에서 위 코드를 컴파일합니다. 분석 도구는 imageWithCGImage ::가 카운트 +1의 UIImage를 반환하기 때문에 가능한 메모리 누수를보고하고 참조가 손실됩니다. Leaks Instrument는 메모리 누수가 전혀 없다고보고합니다. 여기서 뭐하는거야?ARC로 메모리 누수

또한 ARC는 수동으로 release을 사용하는 것을 금지하므로 누출을 어떻게 수정합니까?

조언을 제공 할 수있는 사람 덕분입니다.

답변

8

ARC는 C 유형을 관리하지 않으며 그 중 CGImage가 고려 될 수 있습니다. 당신은 ARC 처리되는 핵심 기반 데이터 구조의 CGImageRelease(image);

+(void)setup { 
    UIImage* spriteSheet = [UIImage imageNamed:@"mySpriteSheet.png"]; 
    CGRect rect; 
    animation = [NSMutableArray arrayWithCapacity:numberOfFramesInSpriteSheet]; 
    int frameCount = 0; 

    for (int row = 0; row < numberFrameRowsInSpriteSheet; row++) { 
     for (int col = 0; col < numberFrameColsInSpriteSheet; col++) { 
      frameCount++; 
      if (frameCount <= numberOfFramesInSpriteSheet) { 
       rect = CGRectMake(col*frameHeight, row*frameWidth, frameHeight, frameWidth); 
       //store our image ref so we can release it later 
       //The create rule says that any C-interface method with "create" in it's name 
       //returns a +1 foundation object, which we must release manually. 
       CGImageRef image = CGImageCreateWithImageInRect(spriteSheet.CGImage, rect) 
       //Create a UIImage from our ref. It is now owned by UIImage, so we may discard it. 
       [animation addObject:[UIImage imageWithCGImage:image]]; 
       //Discard the ref. 
       CGImageRelease(image); 
      } 
     } 
    } 
} 
+2

여기 내 질문에 대한 대답을 참조하십시오. http://stackoverflow.com/questions/6260256/what-kind-of-leaks-does-automatic-reference-counting-in-objective-c-not-prevent/6388601 # 6388601 – BoltClock

+0

"create 규칙은 이름에"create "가있는 모든 C 인터페이스 메소드가 +1 파운데이션 객체를 반환하며 수동으로 릴리스해야한다고 말합니다. - 이런! 당연하지. 감사합니다 CodaFi! 감사! –

+0

@ Z.O. 문제 없어. create 규칙은 실제로는 문서에서 찾기가 조금 어렵지만 Apple의 C-Interface를 다룰 때는 매우 중요합니다. [여기 있습니다] (https://developer.apple.com/library/mac/documentation/CoreFOundation/Conceptual/CFMemoryMgmt/Concepts/Ownership.html#//apple_ref/doc/uid/20001148-103029) (규칙을 얻는다). – CodaFi

3

없음을 마친 후 수동으로 심판을 해제해야합니다. 많은 시간이 문제를 만듭니다. 이 경우 수동으로 메모리를 해제해야합니다.