我相信我遵守规则,但是仍然存在问题
我的班级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/