2012-06-11 4 views
3

일부 CGImageRef 객체에 대한 정적 분석기 경고가 표시됩니다. 경고는 "호출자가이 시점에서 소유하지 않은 개체의 참조 횟수가 잘못 감소했습니다." 그러나 나는 그것을 발신자가 소유하기를 원한다. 내 Obj-C 메소드에 삽입해야하는 특별한 문구가 있습니까? 내가 똑같은 것을 줄 짓기 위해 문자 그대로 줄을 만드는 C 함수를 만들면 경고가 사라집니다. 내가 그들을 분리하는 이유는 때로는 내 응용 프로그램이 CGImage (편집 용)를 사용하기 때문에 때로는 UIImage (UIImageView를 설정하기 위해)를 사용하기 때문입니다. 그것은 내가 바로 그것을 반환하기 전에 의미가의 CGImage를 해제하지 않습니다부정확 한 감소에 대한 분석기 경고

+ (UIImage *)imageFromCompressedData:(NSData *)compressedData withSize:(CGSize)size 
{  
    CGImageRef cgImage = [SO2CompressionHandler cgImageFromCompressedData:compressedData withSize:size]; 
    UIImage *returnImage = [UIImage imageWithCGImage:cgImage]; 
    CGImageRelease(cgImage); 

    return returnImage; 
} 

+ (CGImageRef)cgImageFromCompressedData:(NSData *)compressedData withSize:(CGSize)size 
{ 
    //...decompress data 

    CGDataProviderRef provider = CGDataProviderCreateWithCFData((__bridge CFDataRef)decodedData); 
    CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB(); 
    CGImageRef outImageRef = CGImageCreate(width, height, 8, 32, 4*width, colorSpace, kCGImageAlphaPremultipliedLast, provider, NULL, false, kCGRenderingIntentDefault); 
    CGDataProviderRelease(provider); 

    if(CGSizeEqualToSize(CGSizeZero, size) || CGSizeEqualToSize(CGSizeMake(width, height), size)) 
    { 
     CGColorSpaceRelease(colorSpace); 
     return outImageRef; //Flagged as potential leak 
    } 

    //...or resize and return the in a similar way 
} 

:

여기에 (의 관련 필수 요소까지 제거) 관련 코드는? 그러면 그것은 단지 잘못된 기억 일 것입니다. 이것이 C- 함수를 사용해야한다는 힌트입니까? 또는 정적 분석기는 단순히 C- 기능을 검사하지 않습니다. cgImageFromCompressedData:withSize:CGImageCreateWithCompressedData(NSData *compressedData, CGSize size)으로 변경했으며 마법처럼 더 이상 경고하지 않았습니다. 방금 경고를 무시해야합니까, 아니면 어떤 장점이 있습니까? Obj-C 메소드 이름에 "new"또는 "alloc"이라는 단어를 추가해야합니까?

답변

7

메소드가 +1 객체를 반환하는 경우 이름은 'new'로 시작해야합니다 (예 : newCGImageFromCompressedData:withSize:. 이렇게하면 분석기가 의도적으로 보존 된 객체를 반환하고 소유권을 호출자에게 넘겨 준다고 알립니다.

또는 당신이 (당신의 .H 파일에 예) 당신의 메소드 선언이으로 바꾸어 그 소리 속성 CF_RETURNS_RETAINED를 사용할 수있다 :

+(CGImageRef)cgImageFromCompressedData:(NSData *)compressedData 
           withSize:(CGSize)size CF_RETURNS_RETAINED; 

를 이것은 또한 방법을 반환하도록되어 분석기를 알려줍니다 유지 된 객체이지만 메서드 선택기를 변경하지 않아도됩니다.

+0

아 하, 매우 유익한. 고마워. 가능한 경우 8 분 안에 답변을 수락합니다. – borrrden

+0

또한 내 편집 내용을 확인하십시오. 처음에는'NS_RETURNS_RETAINED'를 잘못 사용했습니다. –

+0

어쨌든 첫 번째 방법을 사용하려고했지만 감사했습니다. :) – borrrden

관련 문제