gpt4 book ai didi

objective-c - EXC_BAD_ACCESS 在 block 中使用 weakSelf 时

转载 作者:行者123 更新时间:2023-12-04 02:59:59 29 4
gpt4 key购买 nike

我已经为这个问题苦苦挣扎了一段时间,因为我不认为我完全理解保留周期。我对此完全陌生,我正在尝试了解更多相关信息。

我收到带有以下代码的 EXC_BAD_ACCESS 消息。

我开始使用 weakSelf,因为如果我只使用 self.successBLock();,我会收到 2 个关于保留周期的警告。确切的警告是:

Capturing 'self' strongly in this block is likely to lead to a retain cycle

也许我什至不应该费心使用弱者,但我对此不太确定。

这是我在 block 中使用 weakSelf 的部分:

__weak Request *weakSelf = self;

[_operation setCompletionBlockWithSuccess:^(AFHTTPRequestOperation *operation, id responseObject) {
weakSelf.successBlock(operation.response, responseObject);
} failure:^(AFHTTPRequestOperation *operation, NSError *error) {
weakSelf.failureBlock(operation.response, error);
}];

这就是我分配 block 属性的方式:

typedef void (^successBlock)(NSHTTPURLResponse *response, id responseObject);
typedef void (^failureBlock)(NSHTTPURLResponse *response, NSError *error);

@property (nonatomic, copy) successBlock successBlock;
@property (nonatomic, copy) failureBlock failureBlock;

最佳答案

__weak 引用被设置为 nil 如果它指向的对象被释放。因此,如果您的 Request 对象在完成 block 执行时已经被释放调用时,weakSelfnil。在这种情况下,weakSelf.successBlock 的计算结果为 NULL 指针,这会导致崩溃。

下面的模式避免了这个问题:

[_operation setCompletionBlockWithSuccess:^(AFHTTPRequestOperation *operation, id responseObject) {
Request *strongSelf = weakSelf;
if (strongSelf) {
strongSelf.successBlock(operation.response, responseObject);
}
} ...
如果 Request 对象已经被释放,

strongSelf 将为 nil。否则强引用确保对象不被释放当 block 正在执行时。

另一方面,如果您希望 Request 对象存在直到完成 block 被调用,那么你不应该使用弱引用。

关于objective-c - EXC_BAD_ACCESS 在 block 中使用 weakSelf 时,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16442476/

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