Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/iphone/35.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/5/objective-c/26.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
Iphone 不做交易_Iphone_Objective C_Uiview - Fatal编程技术网

Iphone 不做交易

Iphone 不做交易,iphone,objective-c,uiview,Iphone,Objective C,Uiview,我在superview中看到: mySubView = [[MySubView alloc] init]; [self addSubview:mySubView]; [mySubView release]; 然后在稍后的某个时间点,在子视图中: [self removeFromSuperview]; 当我调试它时,我注意到子视图的dealloc从未被调用,尽管我相当确定引用计数应该是0。你知道为什么会这样吗?谢谢。我不知道从superview中移除是否会执行此操作,但superview中的指

我在superview中看到:

mySubView = [[MySubView alloc] init];
[self addSubview:mySubView];
[mySubView release];
然后在稍后的某个时间点,在子视图中:

[self removeFromSuperview];

当我调试它时,我注意到子视图的dealloc从未被调用,尽管我相当确定引用计数应该是0。你知道为什么会这样吗?谢谢。

我不知道从superview中移除是否会执行此操作,但superview中的指针需要释放。如果removeFromSuperview只释放子视图中指向superview的指针,而不释放superview中指向子视图的指针,则这可能是问题的根源。

是,当您发送removeFromSuperview时,随后释放已发送的消息。每次释放调用都会减少保留计数。如果:

MySubView * mySubView = [[MySubView alloc] init];
[window addSubview:mySubView];
[mySubView release];
[mySubView removeFromSuperview];
结果将如您预期的那样:从SuperView移除后,mySubView的保留计数变为0,并将调用dealloc


但在您的示例中,“then at some point later”后面有更多的代码,而其他一些对象(它不是superview)保留了mySubView。例如,您可以记录retainCount值以查看视图的保留/发布位置。

您不能依靠retainCount为调试提供任何有用的信息。在某些情况下,它可能会对您有所帮助,但苹果的文档中说:

重要提示:此方法在调试内存管理问题时通常没有价值。由于任意数量的框架对象可能保留了一个对象以保存对该对象的引用,而同时自动释放池可能保留了一个对象上任意数量的延迟发布,因此您不太可能从该方法中获得有用的信息。 要了解您必须遵守的内存管理基本规则,请阅读“内存管理规则”。要诊断内存管理问题,请使用适当的工具: LLVM/Clang静态分析器通常可以在运行程序之前发现内存管理问题。 Instruments应用程序中的Object Alloc instrument(对象分配)可以跟踪对象分配和销毁。 Shark(请参阅Shark用户指南)还分析了内存分配(以及程序的许多其他方面)

我相当确定引用计数应该是0

是吗?为什么?

忘记保留计数。只考虑对象所有权,因为保留计数对于调试内存管理几乎毫无意义

苹果提供了很多工具来调试内存管理问题。使用它们

这个链接可能会有帮助


您的标题提到了
[自动释放]但在您的问题中根本没有提到它。请澄清这一点。对此表示抱歉,它的意思是说[从SuperView中自我移除]。。(是否可以编辑标题?)在api中,removeFromSuperview表示“此方法释放接收器”,因此我认为应该将其引用计数设置为0(addSubView保留它,removeFromSuperview释放它),谢谢。好的,如果代码按照我的想法执行,那么我肯定需要记录retain计数。我不知道该怎么做,它在调试窗口的某个地方吗?[anObject retainCount],但通常通过获取retainCount来调试程序是个坏主意,因为这通常会产生误导。在这种情况下,静态分析器可能能够帮助您(在XCode中构建和分析);并非总是信息丰富,但在许多情况下仍可能有所帮助。与静态分析器相同,当内存分配/释放中出现逻辑错误时,它会有所帮助。当视图从super中删除但未解除分配时,这可能是正常行为。你到底有什么问题?你想找到什么东西“持有”你的观点还是别的什么?我想找到某种“保留”发生的地方。你是对的,我的子视图使用了一个计时器,其中调用目标是视图,所以我想这做了一些保留。如果我使计时器失效,那么一切都会正常。我以前在dealoc方法catch-22中有计时器失效!谢谢你的帮助。