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

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

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


我将这个块传递给我的课程持有的HttpConn obj:

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


现在解决这个问题:我的对象从未被释放!

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


障碍不是指自我!
HttpConn类保留该块的副本,如下所示:


  chunkBlock_ = [chunkBlock复制];
  
  任何解释将不胜感激!


编辑

额外信息:
我已经验证了,如果我要释放operation_,那么我的对象将被释放:

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


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

最佳答案

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

**retriesNumber++;**


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

(INVISIBLE strong pointer to self)->retriesNumber


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

pSelf->retriesNumber++;


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

关于ios - 尽管复制了块,但块阻止了dealloc,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/22296832/

10-09 09:41