Ios 块正在阻止解除锁定,尽管该块已被复制
我相信我遵守了规则,但仍然存在一个问题 我的类init包含如下块:Ios 块正在阻止解除锁定,尽管该块已被复制,ios,automatic-ref-counting,block,reference-counting,Ios,Automatic Ref Counting,Block,Reference Counting,我相信我遵守了规则,但仍然存在一个问题 我的类init包含如下块: HTTPChunkReceiveBlock chunkBlock = ^(id connection, NSData *data) { NSLog(@"Hi there!!"); }; 我正在将此块传递到我的类持有的HttpConn obj中: operation_ = [[HttpClient sharedClient] performChunkedRequest:url
HTTPChunkReceiveBlock chunkBlock = ^(id connection, NSData *data) {
NSLog(@"Hi there!!");
};
我正在将此块传递到我的类持有的HttpConn obj中:
operation_ = [[HttpClient sharedClient] performChunkedRequest:url
chunkHandler:chunkBlock];
现在问题来了:我的对象永远不会被释放
问题似乎是由于HttpConn保留了指向块的指针而引起的,但我想指出两点:
HTTPChunkReceiveBlock chunkBlock = ^(id connection, NSData *data) {
NSLog(@"Hi there!!");
};
chunkBlock_=[chunkBlock复制]李>
任何解释都将不胜感激
编辑
额外信息:
我已验证,如果我正在释放操作,则我的对象已解除分配:
reader.operation_ = nil;
reader = nil; //previous line allows 'dealloc' to be called
现在重复这个问题:操作并没有得到一个读卡器self的指针,它只保存一个不引用self的块的副本 好的,我会回答我自己的问题,这样其他人就不会陷入同样的问题@DarkDust实际上是对的。有一句话我完全忽略了:
**retriesNumber++;**
它看起来像一个无辜的句子,但因为RetriesMember是类的成员,所以它实际上是有意义的
(INVISIBLE strong pointer to self)->retriesNumber
因此,解决方案是将其声明为属性(相对于成员ivar),以便我们可以使用self访问它,然后写入:
pSelf->retriesNumber++;
谢谢你们的快速支持,我希望其他人也能从中学习 你怎么知道那个街区是罪魁祸首?你真的用仪器验证过吗?我非常怀疑。你的类是否作为委托,这将是一个典型的保留原因为了避免内存泄漏,你必须始终平衡Block_copy()和Block_release()。块是否真的像上面那样,只是一个
NSLog
?如果没有,请发布真实的block.Hm,您是否已将NSLog
重新定义为宏以更好地记录?(命令单击NSLog查看其定义。)除此之外,我无法看到任何东西是如何被块捕获的。foo->bar
语法实际上访问了foo
指向的对象上的实例变量bar
,因此这里不需要属性。重要的一点是使用.Hi@DarkDust,我已经修正了我的答案,让它更清楚,说隐形。这里的要点是,当提到IVAR时,self并没有出现。我们必须把它变成一个属性,这样弱的自我就可以被使用。我说的是pSelf->retriesNumber++代码>,这不是在访问属性,而是在访问实例变量。如果我没有错,编译器在弱指针上使用->时会抱怨,在某个点上可能会变成零。使用属性时,您正在发送消息,这是一种安全操作