Утечка памяти NSBlockOperation - PullRequest
0 голосов
/ 27 мая 2018

Я объявил NSBlockOperation с объектом, объявленным внутри этой операции.Мое приложение постоянно падает из-за проблем с памятью.Оцените любой намек с хорошим объяснением того, что потраченные несколько часов все еще не увенчались успехом.

время выполнения: проблемы с памятью - (5 типов с утечкой): 1 экземпляр NSExactBlockVariable с утечкой

- (EMUserInfoOperation*)loadingLocalModelOperationWithColor:(EMOutfitColor)outfitColor gender:(EMGender)gender {

__block EMUserInfoOperation* operation = [EMUserInfoOperation blockOperationWithBlock:^{
    NSURL* remoteURL = [NSURL URLWithString:self.settings[kEMRemoteUrlKey]];

    EMOutfitModel* model = nil;

    if (remoteURL == nil) {
        model = [[EMDomainDataLoader sharedLoader] loadEmbededOutfitNamed:self.name gender:gender];
    } else {
        model = [[EMDomainDataLoader sharedLoader] loadCachedOutfitNamed:self.name withVersion:self.version gender:gender];
    }
    [model syncApplyTextureFromPath:[self texturePathForColor:outfitColor] textureSampler:EMTextureSamplerColor];

    NSString *alphaPath = [self texturePathForAlpha];
    if(alphaPath.length > 0) {
        [model syncApplyTextureFromPath:alphaPath textureSampler:EMTextureSamplerAlpha];
    }

    operation.userInfo = model;
}];

return operation;
}

1 Ответ

0 голосов
/ 27 мая 2018

Я предполагаю, что ваш EMUserInfoOperation объект имеет строгую ссылку на блок, с которым создана операция.И этот блок также имеет сильную ссылку на объект EMUserInfoOperation, поскольку он захватывает переменную operation.Таким образом, у вас есть цикл сохранения.

Блок можно слабо ссылаться на объект EMUserInfoOperation, выполнив следующие действия:

EMUserInfoOperation* operation;
__block __weak typeof(operation) weakOperation;
weakOperation = operation = [EMUserInfoOperation blockOperationWithBlock:^{
    typeof(operation) strongOperation = weakOperation;
    if (strongOperation) {

        // ...

        strongOperation.userInfo = model;
    }
}];
return operation;
...