gpt4 book ai didi

ios - 将 'NSError *const __strong *' 发送到类型为 'NSError *__autoreleasing *' 的参数会更改指针的保留/释放属性

转载 作者:可可西里 更新时间:2023-11-01 04:22:05 26 4
gpt4 key购买 nike

这个问题类似于ios NSError types但是那里描述的解决方案没有用,我相信这不是我所需要的。

我有一个执行异步调用然后调用完成 block 的方法。当我尝试将 NSError ** 传递给完成 block 时,出现此错误:

Sending 'NSError *const __strong *' to parameter of type 'NSError *__autoreleasing *' changes retain/release properties of pointer

代码如下:

+(void) agentWithGUID:(NSString *) guid completion:(void (^)(AKAgentProfile * agentProfile, NSError ** error)) completionBlock
{
dispatch_queue_t requestQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
dispatch_async(requestQueue, ^{
NSString * parameterizedUrl = [AKAgentProfileEndPoint stringByAppendingString:guid];
NSURL *url = [NSURL URLWithString:parameterizedUrl];
NSData *data = [NSData dataWithContentsOfURL:url];

NSError * error = nil;

AKAgentProfile * agentProfile = [[[AKAgentFactory alloc] init] agentProfileWithData:data error:&error];

dispatch_async(dispatch_get_main_queue(), ^{
completionBlock(agentProfile,&error);
});

});
}

最佳答案

您的完成 block 参数完全是胡说八道。

调用堆栈上有一个变量 NSError* err。

然后您尝试将 err 的地址传递给将在主线程中调用的完成 block 。到调用完成 block 时,您的函数早已返回,并且 &err 是垃圾。如果完成 block 试图在那里存储任何东西,它会在很久以前你的 err 变量在堆栈上的地方存储一个 NSError* ,很可能会覆盖一个完全不相关的方法的一些有值(value)的数据。

这不适用于回调 block 。

关于ios - 将 'NSError *const __strong *' 发送到类型为 'NSError *__autoreleasing *' 的参数会更改指针的保留/释放属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27744037/

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