Я использую проект 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];
}