首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >内存泄漏NSBlockOperation

内存泄漏NSBlockOperation
EN

Stack Overflow用户
提问于 2018-05-27 12:21:15
回答 1查看 245关注 0票数 0

我使用在该操作中声明的对象声明了NSBlockOperation。由于内存问题,我的应用程序不断崩溃。感谢任何关于这个问题的很好解释的暗示,花了几个小时还是没有成功。

运行时:内存问题- (5种泄漏类型):NSExactBlockVariable的一个实例泄漏

代码语言:javascript
复制
- (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;
}
EN

回答 1

Stack Overflow用户

发布于 2018-05-27 17:46:45

我猜您的EMUserInfoOperation对象对创建操作的块有很强的引用。这个块还具有对EMUserInfoOperation对象的强烈引用,因为它捕获了operation变量。所以你有一个保留周期。

通过执行以下操作,可以使块仅弱引用EMUserInfoOperation对象:

代码语言:javascript
复制
EMUserInfoOperation* operation;
__block __weak typeof(operation) weakOperation;
weakOperation = operation = [EMUserInfoOperation blockOperationWithBlock:^{
    typeof(operation) strongOperation = weakOperation;
    if (strongOperation) {

        // ...

        strongOperation.userInfo = model;
    }
}];
return operation;
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50552082

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档