2

PhotoScrollerNetwork プロジェクトを使用して、プロジェクト内のビューに単一の高解像度画像を提供し、それを自動的に並べて表示するため、メモリが適切に管理されます。このコード ブロックを使用して完全な高解像度画像をメモリに描画し、そこからタイルを計算できるようにします。

-(void)drawImage:(CGImageRef)image {
       madvise(ims[0].map.addr, ims[0].map.mappedSize - ims[0].map.emptyTileRowSize, MADV_SEQUENTIAL);

       unsigned char *addr = ims[0].map.addr + ims[0].map.col0offset + ims[0].map.row0offset * ims[0].map.bytesPerRow;
       CGContextRef context = CGBitmapContextCreate(addr, ims[0].map.width, ims[0].map.height, bitsPerComponent, ims[0].map.bytesPerRow, colorSpace, kCGImageAlphaNoneSkipFirst | kCGBitmapByteOrder32Little);
       assert(context);
       CGContextSetBlendMode(context, kCGBlendModeCopy); // Apple uses this in QA1708
       CGRect rect = CGRectMake(0, 0, ims[0].map.width, ims[0].map.height);
       CGContextDrawImage(context, rect, image);
       CGContextRelease(context);

       madvise(ims[0].map.addr, ims[0].map.mappedSize - ims[0].map.emptyTileRowSize, MADV_FREE);
 }

クラスのdeallocメソッドでは、ims を解放 (「free(ims)」) しているため、適切に処理する必要があります。ただし、新しいビュー (および drawImage の呼び出し) を繰り返し作成すると、メモリがいっぱいになります。コメントCGContextDrawImage(context, rect, image);すると、メモリは問題ないので、何かがメモリに保持されていると思いますが、何が取得できません... dealloc メソッドは常に呼び出されるため、問題はありません。

編集:私のイメージも適切にリリースされます。これは完全なフローです:

- (void)myFunc {
        CFDictionaryRef options = [self createOptions];
        CGImageRef image = CGImageSourceCreateImageAtIndex(imageSourcRef, 0, options);
        CFRelease(options);
        CFRelease(imageSourcRef);
        if (image) {
            [self decodeImage:image];
            CGImageRelease(image);
        }
}

- (void)decodeImage:(CGImageRef)image {
    assert(decoder == cgimageDecoder);

    size_t width = CGImageGetWidth(image);
    size_t height = CGImageGetHeight(image);

#if LEVELS_INIT == 0
    zoomLevels = [self zoomLevelsForSize:CGSizeMake(width, height)];
    ims = calloc(zoomLevels, sizeof(imageMemory));
#endif

    [self mapMemoryForIndex:0 width:width height:height];

    [self drawImage:image];
    [self createLevelsAndTile];
}
4

1 に答える 1