Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/109.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/visual-studio-2012/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 块正在阻止解除锁定,尽管该块已被复制_Ios_Automatic Ref Counting_Block_Reference Counting - Fatal编程技术网

Ios 块正在阻止解除锁定,尽管该块已被复制

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

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

我的类init包含如下块:

HTTPChunkReceiveBlock chunkBlock =  ^(id connection, NSData *data) {
    NSLog(@"Hi there!!");
};
我正在将此块传递到我的类持有的HttpConn obj中:

operation_ = [[HttpClient sharedClient] performChunkedRequest:url 
                                                 chunkHandler:chunkBlock];
现在问题来了:我的对象永远不会被释放

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

  • 该块不是指self
  • 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++,这不是在访问属性,而是在访问实例变量。如果我没有错,编译器在弱指针上使用->时会抱怨,在某个点上可能会变成零。使用属性时,您正在发送消息,这是一种安全操作