gpt4 book ai didi

ios - 尽管 block 已被复制,但 block 正在阻止释放

转载 作者:行者123 更新时间:2023-11-29 03:10:34 24 4
gpt4 key购买 nike

我相信我遵守了规则,但仍然存在问题

我的类 init 包含这样一个 block :

HTTPChunkReceiveBlock chunkBlock =  ^(id connection, NSData *data) {
NSLog(@"Hi there!!");
};

我正在将此 block 传递到我的类(class)持有的 HttpConn obj 中:

operation_ = [[HttpClient sharedClient] performChunkedRequest:url 
chunkHandler:chunkBlock];

现在问题来了:我的对象从未被释放!!

问题似乎是因为HttpConn 保留了指向 block 的指针,但我想提两点:

  1. block 不是指自己!
  2. HttpConn 类保留 block 的副本,如下所示:

    chunkBlock_ = [chunkBlock copy];

任何解释将不胜感激!

编辑

额外信息:我已经验证,如果我正在释放 operation_,那么我的对象就会被释放:

reader.operation_ = nil;
reader = nil; //previous line allows 'dealloc' to be called

现在重复问题:操作没有获得读者的self指针,它只保存不引用self的 block 的副本!

最佳答案

好的,我会回答我自己的问题,以免其他人陷入同样的​​问题。 @DarkDust 实际上是正确的。有一条我完全忽略的细线:

**retriesNumber++;**

看似无辜的一句话,但是因为retriesNumber是类的成员,所以其实是有意思的

(INVISIBLE strong pointer to self)->retriesNumber

所以解决方案是将它声明为属性(相对于成员 ivar),以便我们可以使用 self 访问它,然后写:

pSelf->retriesNumber++;

感谢大家的快速支持,我希望其他人也能从中学习!

关于ios - 尽管 block 已被复制,但 block 正在阻止释放,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22296832/

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