虽然块被复制,但块阻止了dealloc

时间:2014-03-10 09:52:24

标签: ios automatic-ref-counting block reference-counting

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

我的班级 init 包含一个这样的块:

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

将此块传递给我的班级所持有的HttpConn obj:

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

现在出现问题:我的对象永远不会被释放!!

问题似乎是由于引起的,因为HttpConn保留了一个指向块的指针,但我想提两点:

  1. 该块不是指自我!
  2. HttpConn类保留了块的副本,如下所示:

      

    chunkBlock_ = [chunkBlock copy];

  3.      任何解释都将非常感谢!

    修改

    额外信息: 我已经确认,如果我正在释放操作_ ,那么我的对象将被解除分配:

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

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

1 个答案:

答案 0 :(得分:1)

好的,我会回答我自己的问题,以便其他人不会遇到同样的问题。 @DarkDust实际上是正确的。有一条小线我完全无视:

**retriesNumber++;**

它看起来像一个无辜的句子,但因为 retriesNumber 是该类的成员,它实际上意味着

(INVISIBLE strong pointer to self)->retriesNumber

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

pSelf->retriesNumber++;

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