gpt4 book ai didi

objective-c - 使用 block 的内存管理 - 泄漏

转载 作者:行者123 更新时间:2023-11-29 13:46:29 27 4
gpt4 key购买 nike

我使用 block 在服务类中执行访问检查,但它正在泄漏内存。有人可以指出我的方法有什么问题吗?问题可能与我在 block 中使用的变量有关。我正在访问实例变量、方法变量并引用 super。

-(RequestDO*)requestWithURL:(NSString*)url andDelegate:(id<RequestDelegate>)delegate_ signURL:(BOOL)sign_ request:(RequestDO*)request_ postData:(NSString*) postData_ {

if([self requiresUpdatedAccess]){

if(accessRequest == nil){
accessRequest = [[UpdatedAccessManager getPaymentStatus:self] retain];

if(accessRequest.processStatus == kRequestComplete){ // Access check is complete (cached)
[accessRequest release], accessRequest = nil;
return [super requestWithURL:url andDelegate: delegate_ signURL:sign_ request:request_ postData: postData_]; // Do original service request
}
else{
Block_release(completionBlock_);

// When access check is done, we will perform this block to process the original request
completionBlock_ = Block_copy(^(){
/*
url - an instance variable
delegate_, sign_, request_ and postData_ is method scoped variables
*/
NSString *updatedUrl = [Service updateUrlWithUserData: url];
[super requestWithURL:updatedUrl andDelegate: delegate_ signURL:sign_ request:request_ postData: postData_];
});

Block_release(failureBlock_);

// If access check fails, we will perform this block to inform about the error
failureBlock_ = Block_copy(^(RequestDO* req_, NSError* err_){
[delegate_ requestFailed:self.request withError: err_];
});
}
}
}
else{
return [super requestWithURL:url andDelegate: delegate_ signURL:sign_ request:request_ postData: postData_]; // This service does not need access check
}

return accessRequest;
}

在 dealloc 中,我为两个 block 设置了 Block_release。

最佳答案

该 block 将保留所有使用过的变量。在您的情况下,由于在 block 中使用了对象,因此对象的保留计数将为 2。因此 dealloc 不会被调用,并且您有一个经典的保留周期。要解决此声明

__block id blockSelf = self;

在 block 之前使用 blockSelf 而不是 block 中的 self。

关于objective-c - 使用 block 的内存管理 - 泄漏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7186894/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com