Iphone 目标C:检测一个物体是否没有更多的支架

Iphone 目标C:检测一个物体是否没有更多的支架,iphone,objective-c,memory,memory-management,Iphone,Objective C,Memory,Memory Management,我使用NSMutableArray作为“窗口管理器”来存储我的所有NSView对象,发送时就像 [windowManager addObject:self]; 在每个NSView的ViewDidLoad之后 问题是,如果“windowManager”NSMutableArray存储了被调用释放的对象(windowManager是唯一保存其实例的对象),我如何在其上检测 在我调用这些视图中的一个来发布之后 SomeNSViewPointer = nil; ,我还需要WindowManager来

我使用NSMutableArray作为“窗口管理器”来存储我的所有NSView对象,发送时就像

[windowManager addObject:self];
在每个NSView的ViewDidLoad之后

问题是,如果“windowManager”NSMutableArray存储了被调用释放的对象(windowManager是唯一保存其实例的对象),我如何在其上检测

在我调用这些视图中的一个来发布之后

SomeNSViewPointer = nil;
,我还需要WindowManager来检查上述内容。

如果([myView retainCount]==1),则它只会保留在WindowManager中

[编辑]了解NSObject引用中的重新计数。正如JeremyP所建议的,在代码中使用它并不明智,但要更好地考虑代码设计


当您通过“addObject”向NSMutableArray添加任何内容时,该NSMutableArray会在其上执行保留操作。您需要从NSMutableArray中删除该对象才能将其释放,如果这是您想要的

[yourNSMutableArray removeObjectIdenticalTo:yourNSView];

您可以发送您正在检查
-(int)retainCount
消息的视图,并检查它是否为一个视图(即单个retain是否将其添加到数组中)?这个问题提出了一个危险信号,即您正在做一些可能被认为是糟糕的设计的事情,为什么要这样做?

当您这样做时:

[someNSViewPointer release];
SomeNSViewPointer = nil;
改为这样做:

[someNSViewPointer release];
[windowManager removeObject: someNSViewPointer];
SomeNSViewPointer = nil;


我不得不质疑,为什么要存储对视图的两个引用。我认为您的设计需要审查。

您担心内存泄漏吗?当然我需要,这就是为什么我问何时以及如何知道何时从那里删除它:}那么,您为什么不知道何时释放它呢?如果您负责释放对象,那么您就是知道何时释放它的人。此时,将其从阵列中删除。什么是混淆?如果您不知道要释放的对象是否在数组中,请检查。如果存在,则将其移除。例如,请参阅编辑此答案。这可能会起作用,但是,如果我有一个LocationManager帮助程序类,该类包含一个NSMutableArray,它在其中存储所有用于位置更新的委托,该怎么办?您试图实现什么?您在此上下文中(在LocationManager helper类中)谈论的NSMutableArray是否与您最初提到的NSMutableArray相同?我不清楚你现在在问什么?bbum(一位苹果工程师)说:如果你打电话给retainCount,你就做错了@Amir询问如何知道windowManager是否是唯一一个保存视图实例的,这就是如何做到的。。。我在代码中从未调用过retainCount。@KakoSquid:您不能使用retainCount来确定是否需要从数组中删除对象。如果运行时的某个内部部分也保留了该对象,该怎么办?如果您有某种sharedInstance,例如,一个LocationHelper,其中包含多个代理,所有代理在位置更新后都会获得位置更新,该怎么办。如果您不将这些代理从locationHelper的代理数组中删除,则不会释放所有这些代理。这是一个糟糕的想法,因为飞行中可能有一些对象最近保留了您的视图,但这些对象尚未释放视图,或者称为
自动释放
,在这种情况下,您的视图将显示不同的视图,还有可能是不确定的
retainCount
,与您期望的答案不同。既然这个答案现在已被接受,我将重申:说真的,这是一个非常糟糕的主意。不要用它。他在回答中指出了这一点。好答案的关键是回答,而不是谈论风格、方法、感觉或宗教。人们仍然需要从自己的错误中吸取教训。@Helge:避免使用
-retainCount
方法没有什么宗教意义。它根本做不到你想要的。不要用它。这是一个糟糕的答案,因为它可能会鼓励人们做错事。目前的答案并没有指出使用
-retainCount
是不好的,只是这个问题是(可能)糟糕设计的症状。这就是我投反对票的原因。@toiletseat:如果你改写第一句话,我将取消我的反对票。@JeremyP我保留我的答案,因为它回答了他的问题,他可能有很好的理由这样做。我只希望他读第二部分,并给我们一个答案!这可能会起作用,但是,如果我有一个LocationManager帮助程序类,它包含一个NSMutableArray,它在其中存储所有用于位置更新的委托,该怎么办?@Alon:在这种情况下,您必须向LocationManager帮助程序类发送一条消息,以从其列表中删除视图。但是,您可能还需要考虑键值观察可能对您有帮助。i、 e.视图可以观察助手类的location属性,并在属性更改时进行更新。