2009-09-26 1 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 그것이 MyObjectTwo 안에 유지 되었기 때문에 1의 카운트를 유지해야한다. 그것은 또한 객체를 보유하고있는 것이 무엇인지 알 수 있습니까? 즉, myFirstObject의 보유 수는 1이고 현재 mySecondObject가 보유하고 있음을 알 수 있습니다. 이 정보를 찾는 편리한 방법이 있습니까?

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

더이 몇 단계를 수행하고 myFirstObject가 유사한 행동을 다른 개체 MyObjectThree 및 MyObjectFour이 있다는 것을 1보다 더 세고 유지 한 의견 :이 사이비 코드처럼 작동 조건 코드를 가질 수 있습니다 MyObjectTwo에는 MyObjectOne을 유지할 수있는 메서드가 있습니다. 그리고 이제는 MyObjectTwo, MyObjectThree 및 MyObjectFour 중 일부는 첫 번째 객체를 보유하고있는 인스턴스와 그렇지 않은 인스턴스가 여러 개 있다고 가정합니다. 누가 그리고 무엇을 지키고 있는지 알 수있는 방법이 있습니까?

아직 배우기 때문에 내 구문이 100 % 정확하지는 않지만 잘하면 문제는 명확합니다.

답변

6

아니요, 그렇게 할 수 없습니다. 객체는 관련 객체가없는 일반 바닐라 C 함수 내부에서 retain을 호출 할 수 있기 때문에 객체를 보유한 객체를 추적하지 않으며 항상 그러한 객체가있는 것은 아닙니다.

개체를 보유하고있는 사람을 추적하려면이 작업을 직접 수행해야합니다. 보유 할 때마다 보유자 목록에 자신을 추가하십시오. 오브젝트 내부에 NSArray이 유지됩니다.

나는 당신이하고 싶은 것을 정확히 모르지만, 당신은 거의 틀린 방향으로 가고 있습니다. 누가 대부분의 시간을 알기에 정말로 유용한 것이 아닌지를 파악하고 아마도 요법을 수행하는 훨씬 더 좋은 방법이있을 것입니다.

+0

응답 해 주셔서 감사합니다. 나는 특히 아무것도하려고하지 않았습니다. 이것이 이론적으로 가능한지 궁금합니다.보유자의 배열 목록에 자신을 추가하는 개념은 의미가 있습니다. –

6

무언가를 디버깅하기 만하면 인스턴스가 메모리에 고착 된 것으로 보이는 클래스의 retain 메서드를 재정의 할 수 있습니다. 그런 다음 재정의 된 메서드에서 중단 점을 설정하면 중단 점이 발생할 때마다 스택에 고정자가 표시됩니다.

+0

의미가 있습니다. 팁 고마워. –

+1

멋진 팁. retain을 재정의하는 방법은 다음과 같습니다. - (id) retain; { return [super retain]; } – Gomfucius

관련 문제