2010-10-23 49 views
2

在Objective-C中,有什麼方法可以找出哪些對象是保留另一個對象的對象?確定誰握住對象

例如,我有一個MyClass對象的集合,如果我遍歷它們以獲得每個對象的保留計數,我可以看到計數爲2.如何找出持有者是誰?

for (NSString *aKey in aDictionaryOfMyObjects) 
{ 
    MyClassObject *myClassObj = [aDictionaryOfMyObjects objectForKey:aKey]; 

    // following shows a retain count of 2. Presumably, the first count is 
    // due to myClassObj is held as the value in NSDictionary and second is because I 
    // I just acquired a pointer to it above. I'd like to find out who exactly 
    // might have references to myClassObj. 
    NSLog(@"retain count = %d", [myClassObj retainCount]); 
} 

回答

3

你不能。您可以在-retain上設置斷點操作,以便您可以實時查看該斷點的時間,也可以使用dtrace來實現相同的目標。但是你不能從一個物體向它的固定器倒退。

總體而言,您不應該依賴計數保留。您應該依賴Apple針對Objective-C的內存管理指南中編寫的規則。

+0

爲了擴大格雷厄姆所說的話:保留點數最多是不可靠的。他們對目標的記憶管理情況給出了一幅悲慘的不完整的圖像。如果你僅僅依靠它們來獲得更多的補充信息,那麼你最終會傾向於風車。 – Chuck 2010-10-23 21:00:05

+1

分配工具還可以跟蹤所有的保留/釋放/自動釋放事件,並會向您顯示其中任何一個被調用的位置。比使用調試器要容易得多,比dtrace還要自動化得多。 – bbum 2010-10-31 18:29:14

-3

你不行。這些信息通常對你來說不重要。