2009-09-26 3 views
2

В Objective C есть способ определить во время выполнения, если объект сохранен, какой другой объект может сохранить этот объект?Objective-C: как определить, какой другой объект хранит определенный объект?

Или выражаясь немного иначе:

Если есть поводки на собаку можно узнать, кто держит поводок?

Предположим, у вас есть этот гипотетический сценарий:

MyObjectOne

и

MyObjectTwo

внутри реализации MyObjectTwo что-то вроде

- (void)setFirstObject:(MyObjectOne *)firstObj { 
[firstObj retain]; 
    // do stuff with object and under certain conditions don't release it  
} 

Теперь в другом месте в коде могут быть другие места, которые создают и сохраняют объекты

// Create the two objects 
myFirstObject = [[MyObjectOne alloc] init]; 
mySecondObject = [[MyObjectTwo alloc] init]; 

// ... 
// Some process requires retaining the first object 
[myFirstObject retain] 

// ... 
// some other place requires passing the first object to the second object 
// at which point the first object is retained by the second object 
[mySecondObject setFirstObject:myFirstObject]; 

// ... 
// further on the first object is released 
[myFirstObject release] 

В этот момент теоретически myFirstObject должны иметь сохранить счетчик 1, поскольку он был сохранен внутри MyObjectTwo. Возможно ли также знать, ЧТО сохраняет объект? Другими словами, можно узнать, что myFirstObject имеет значение сохранения 1, и оно в настоящее время сохраняется mySecondObject. Есть ли удобный метод для поиска этой информации? Можно ли иметь условный код, который работает, как этот псевдо код:

if (MyObjectTwo is retaining MyObjectOne) 
{ 
// do something in particular 
} 

Возьмите это на несколько шагов вперед и сказать myFirstObject имеет сохранить счетчик больше 1, и что существуют другие объекты MyObjectThree и MyObjectFour, которые ведут себя подобно MyObjectTwo, поскольку они имеют методы, которые могут сохранить MyObjectOne. И теперь предположим, что есть несколько экземпляров MyObjectTwo, MyObjectThree и MyObjectFour, которые сохраняют первый объект, а некоторые - нет. Есть ли способ узнать, кто и что делает сохранение?

По-прежнему обучение, поэтому мой синтаксис может быть не на 100% правильным, но, надеюсь, вопрос ясен.

ответ

6

Нет, вы не можете этого сделать. Объекты не отслеживают, кто их сохранил, и не всегда есть такой объект, поскольку вы можете вызвать retain из простой функции ваниль C, которая не имеет связанного объекта.

Если вы хотите отслеживать, кто сохраняет объект, вам нужно сделать это самостоятельно. Каждый раз, когда вы сохраняете, вы добавляете себя в список держателей, например. NSArray внутри сохраняемого объекта.

Я не знаю точно, что вы пытаетесь сделать, но вы почти наверняка будете ошибаться. Выяснение того, кто сохраняет то, что на самом деле не очень полезно знать большую часть времени, и, вероятно, гораздо лучший способ сделать то, что вам нужно.

+0

Благодарим за отзыв. Я не пытался ничего делать, в частности. Мне просто интересно, возможно ли это теоретически.Идея добавления себя в список хранителей списка имеет смысл. –

6

Если вы просто хотите отладить что-то, вы можете переопределить метод класса, экземпляр которого, похоже, застрял в памяти. Затем установите точку останова в методе переопределения, и каждый раз, когда срабатывает точка останова, вы увидите фиксатор в стеке.

+0

Имеет смысл. Спасибо за совет. –

+1

Отличный совет. Вот как переопределить сохранение: - (id) сохранить; { return [super сохранить]; } – Gomfucius