gpt4 book ai didi

ios - block 保留他们刚刚传递给的类?

转载 作者:行者123 更新时间:2023-11-29 11:23:19 26 4
gpt4 key购买 nike

我们有一个包装 NSURLConnection 的类。它接受一个 block ,它在完成加载时回调。为了给您一个想法,请参见下文。当您发送请求时,它会将回调保存在实例上。假设我的类(class)名为 Request

// from Request.h
@property (nonatomic, copy) void(^callback)(Request*);
- (void) sendWithCallback:(void(^)(Request*))callback;

我使用的代码看起来像这样:

Request * request = [Request requestWithURL:url];
[request sendWithCallback:^(Request * request) {
// do some stuff
}]

我的问题是: block 对 request 的保留计数做了什么?它复制/保留它吗?请注意,我没有将 __block 放在定义的前面。

我刚刚更改了 Request 中的一些主要内容(从同步 NSURLConnection 切换为异步 ASIHTTPRequest),它在发送后几乎立即开始释放(导致委托(delegate)方法调用已释放的对象)。使用同步 NSURLConnection,这从未发生过。

我想它会被异步释放是有道理的,但我如何适本地保留 request 呢?如果我在创建它后立即保留它,我必须在回调中释放它,但如果请求被取消,回调不会被调用,并且会造成内存泄漏。

最佳答案

what does the block do to the retain count of request? Does it copy/retain it?

不,不是。

Request * request = [Request requestWithURL:url];
[request sendWithCallback:^(Request * request) {
// The request argument shadows the request local variable,
// this block doesn't retain the request instance.
}]

如果 block 没有请求参数,

Request * request = [Request requestWithURL:url];
[request sendWithCallback:^{
// If you use the request local variable in this block,
// this block automatically retains the request instance.
}]

在这种情况下,它会导致保留循环(请求保留 block , block 保留请求)。

请查看我的 AsyncURLConnection 类。 NSURLConnection 保留了 AsyncURLConnection 实例,因此您不会自己拥有 AsyncURLConnection 的东西。

如何使用

[AsyncURLConnection request:url completeBlock:^(NSData *data) {
// Do success stuff
} errorBlock:^(NSError *error) {
// Do error stuff
}];

关于ios - block 保留他们刚刚传递给的类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5561240/

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