문제

내가 사용하는 경우 [UIImage imageWithCGImage:], a CGImageRef, 그런 다음 해제합니까? CGImageRef 아니면 uiimage가 거래 될 때 이것 자체를 처리합니까?

문서는 완전히 명확하지 않습니다. "이 방법은 이미지 객체를 캐시하지 않습니다."라고 말합니다.

원래 나는 전화했다 CGImageRelease CGIMAGEREF에서 통과 한 후 imageWithCGImage:, 그러나 그로 인해 a malloc_error_break 시뮬레이터에서 이중이없는 것이 발생했다고 주장하는 경고.

도움이 되었습니까?

해결책

나는 당신과 동의합니다 - 문서는이 API에 대해 최선을 다해 있습니다. 그러면 당신의 경험을 바탕으로, 나는 당신이 두 대상의 수명에 대한 책임이 있다고 결론을 내릴 것입니다. UIImage 그리고 CGImageRef. 그 외에도 당신은 CGImageRef 적어도 길다 UIImage (명백한 이유로).

다른 팁

에 따르면 코코아 메모리 관리의 기본 규칙, 소유 객체는 더 이상 필요하지 않을 때 소유 한 객체를 해제해야합니다. 다른 물체는 소유권을 스스로 가져 가서 공개 할 책임이 있습니다. 만약 UIImage 유지하려면 객체가 필요하지만 유지하거나 복사하지 않으면 버그입니다. UIImage의 구현은 그와 같이보고되어야합니다.

스노우 레오파드에서 Xcode 3.2.1에서도 같은 문제가 있습니다. 나는 Jason과 거의 같은 코드를 가지고 있습니다.

나는 사용하는 iPhone 샘플 코드를 살펴 보았습니다. imageWithCGImage 그리고 그들은 항상 CGImageRef 사용 CGImageRelease 전화 후 imageWithCGImage.

그렇다면 이것이 시뮬레이터의 버그입니까? 나는 항상 얻습니다 malloc_error_break 내가 사용할 때 콘솔에서 경고 CGImageRelease.

소유권 UIImage ~에 대한 CGImage 불분명합니다. 복사하지 않는 것 같습니다 CGImage 그러나 문서화에 의해 보장되지는 않습니다. 그래서 우리는 그것을 스스로 처리해야합니다.

나는 새로운 서브 클래스를 사용했습니다 UIImage 이 문제를 처리합니다. 통과를 유지합니다 CGImage, 그리고 그 때 그것을 공개합니다 dealloc.

여기 샘플이 있습니다.

@interface  EonilImage : UIImage
{
    @private
    CGImageRef      sourceImage;
}
- (id)initWithCGImage:(CGImageRef)imageRef scale:(CGFloat)scale orientation:(UIImageOrientation)orientation;

@end



@implementation     EonilImage

- (id)initWithCGImage:(CGImageRef)imageRef scale:(CGFloat)scale orientation:(UIImageOrientation)orientation
{
    self    =   [super initWithCGImage:imageRef scale:scale orientation:orientation];

    if (self) 
    {
        sourceImage =   imageRef;
        CGImageRetain(imageRef);
    }

    return  self;
}
- (void)dealloc
{
    CGImageRelease(sourceImage);
    [super dealloc];
}
@end

때문에 CGImage 반환 -[UIImage CGImage] 속성은 동일하지 않습니다 CGImage 클래스 스토어 인 Init Method로 전달되었습니다 CGImage 갈라져.

스노우 레오파드에서 Xcode 3.1을 사용하고 있습니까? 나는 같은 문제를 경험하고 있습니다.

CGContextRef ctx = ...;
CGImageRef cgImage = CGBitmapContextCreateImage(ctx);
UIImage * newImage = [[UIImage imageWithCGImage:cgImage] retain];

CGImageRelease(cgImage); // this should be OK, but it now crashes in Simulator on SL

Xcode 3.2로 업그레이드하면 문제가 해결 될 것이라고 생각합니다.

이것이 도움이되는지 확실하지 않지만 비슷한 문제가있었습니다. 나는 답을 읽은 다음 다음과 같은 것으로 보인다.

CGImageRef cgImage = [asset thumbnail];
    UIImage *thumbImage = [[UIImage imageWithCGImage:cgImage ]retain];
    UIImageView *thumbImageView = [[UIImageView alloc] initWithImage:thumbImage];
    CGImageRelease(cgImage);

제안 된대로 자동 제출을 사용했지만 충분하지 않았습니다. 하나는 UIIMAGEVIEW에 이미지를 추가 한 다음 CGIMAGE를 릴리스했습니다.
충돌하지 않고 잘 처리하지 않았습니다. 왜 - 나는 모르겠지만 효과가있었습니다.

자산 썸네일 부분은 Alasset 라이브러리에서 나온 것이므로 다른 것이 필요할 수 있습니다.

<> 내 의견이 아닙니다. 나는 같은 문제가 있었다. 문서에 따르면

UIImage *image = [[UIImage alloc] initWithCGImage:imageRef];

IMHO는 모든 참조를 정확하게 유지합니다. cgdataprovider를 사용하는 경우 cgdataproviderreleasededatacallback을 살펴보고 콜백에서 중단 점을 설정하십시오. 이미지를 릴리스 한 후 올바르게 호출되며 이미지 데이터 버퍼를 자유롭게 할 수 있습니다.

"This method does not cache the image object."

따라서 uiimage는 소유권을 취하므로 cgimageref를 해제해서는 안됩니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top