Как я могу автоматически выпустить CGLayer? - PullRequest
1 голос
/ 15 февраля 2011

У меня CGLayers кешируется в NSMutableDictionary, где я использую их следующим образом:

- (CGLayerRef)getLayerForCacheKey:(CacheKey)cacheKey andProperty:(id)property {
    NSDictionary *cacheDict = [cacheArray objectAtIndex:cacheKey];
    if (cacheDict) {
        NSValue *encodedLayer = [cacheDict objectForKey:property];
        if (encodedLayer) {
            CGLayerRef returnedLayer = nil;
            [encodedLayer getValue:&returnedLayer];
            return returnedLayer;
        }
    }
    return nil;
}

- (void)saveLayer:(CGLayerRef)layer toCacheWithKey:(CacheKey)cacheKey andProperty:(id)property {
    CGLayerRef layerToSave = CGLayerRetain(layer);
    NSMutableDictionary *cacheDict = [cacheArray objectAtIndex:cacheKey];
    NSValue *encodedLayer = [[NSValue alloc] initWithBytes:&layerToSave objCType:@encode(CGLayerRef)];
    [cacheDict setObject:encodedLayer forKey:property];
    [encodedLayer release];
}

Я считаю, что здесь есть утечка памяти, но не CGLayerRelease'ing returnLayer из getLayerForCacheKey .Есть ли у нас какой-либо метод, с помощью которого они могут быть автоматически освобождены?

CacheKey key = CacheKeyFretNumberHighlight;
CGLayerRef numberLayer = [cacheManager getLayerForCacheKey:key andProperty:note];
// save to cache
if (!numberLayer) {
    numberLayer = CGLayerCreateWithContext(nil, [numberStr sizeWithFont:font], nil);
    CGContextRef numberLayerCtx = CGLayerGetContext(numberLayer);
    UIGraphicsPushContext(numberLayerCtx);
    CGContextSetFillColorWithColor(numberLayerCtx, highlightColor);
    [numberStr drawAtPoint:CGPointZero withFont:font];
    UIGraphicsPopContext();

    [cacheManager saveLayer:numberLayer toCacheWithKey:key andProperty:note];

    CGContextDrawLayerAtPoint(layerCtx, point, numberLayer);
    CGLayerRelease(numberLayer);

} else {
    CGContextDrawLayerAtPoint(layerCtx, point, numberLayer);
}

1 Ответ

1 голос
/ 15 февраля 2011

К сожалению, нет CFAutorelease. Как насчет изменения имени метода извлечения из кэша, чтобы было очевидно, что вы возвращаете копию?

- (CGLayerRef) copyLayerForCacheKey: (CacheKey) key andProperty: (id) property;

Тогда даже статический анализатор должен понимать разницу.

...