문제

여러 속성이있는 객체가 있습니다. 해당 속성 중 하나에 대한 포인터가 있다면 IVAR이 속한 클래스 인스턴스에 대한 포인터를 얻을 수 있습니까?

예를 들어 : foo.bar, 내가 막대의 주소를 알고있는 곳에서 foo의 주소를 찾을 수 있습니까?

이것은 다음과 관련된 것 같습니다. 시간 참조를 실행하십시오 그러나 나는 내가 찾고있는 꽤 참조를 보지 못했습니다.

당신의 도움을 주셔서 감사합니다!

도움이 되었습니까?

해결책

먼저 용어를 약간 조정해야합니다. 속성은 객체에 대한 인터페이스이므로 getter 및 setter 메소드의 형식을 지정하기 때문에 속성에 대한 포인터를 가질 수 없습니다.

Getter에 대한 포인터가 있다면, 메소드 (IMP)는 가장 좋은 방법 (IMP)은 수업에 대한 포인터가 될 것입니다. 확실히 인스턴스로 돌아갈 수는 없습니다.

IVAR에 대한 포인터가 있다면 포함 된 객체 인스턴스로 돌아갈 수있는 방법이 없다고 생각합니다. 당신이 모든 posible foos의 배열을 가지고 있다면, 각각의 IVAR 목록을 요청하고 각 ivar의 주소를 얻을 수 있으며, 이는 문제의 인스턴스를 찾을 수 있습니다.

가장 좋은 솔루션은 BAR이 FOO에 대한 부모 참조를 포함하는 것이므로 Foo.bar.foo가 원하는 대답을 제공합니다. 그러나 그것은 당신이 정확히 무엇을하려고하는지에 달려 있습니다. 이러한 많은 것들을위한 일반적인 코코아 방식은 많은 대표들과 마찬가지로 Foo를 통과시키는 것입니다. 예를 들어:

[obj foo:foo doSomethingWithBar:foo.bar];

다른 팁

객체에 포인터가 "부모"에 대한 포인터가 없거나 명시 적으로 직접 추적하지 않는 한, 나는 그것을 해결할 방법이 없다고 생각합니다. 당신은 기본적으로 "누가 나를 가리키는 사람"에 대한 금액을 찾기 위해 기억을 통해 추적해야 할 것입니다. 본질적으로 단일 연결된 목록에서 이전 노드를 찾는 것과 동일한 문제입니다. 처음부터 시작하여 관심 노드를 가리키는 노드에 도달하면 중지해야합니다.

추적하려는 문제 foo 주소에서 bar 그게 다 foo.bar 객체의 주소를 포함하는 포인터입니다. foo "바"라고 부릅니다. 단순성을 위해서, 그것을 상상해보십시오 foo 주소 0x1000에 있습니다 foo.bar 0x1008이고 0x2000의 다른 객체를 가리 킵니다. 이제 주소 0x2000이 있다면 0x1008이 포인트를 가리키는 것을 쉽게 알 수 없습니다.

N 다른 주소가 0x2000을 가리킬 수 있다고 상상하면 훨씬 더 복잡합니다. 따라서 메모리를 스캔하더라도 포인터가 물체, 구조물, 로컬 변수에 속했는지, 심지어 임의의 패턴인지 알 수 없습니다. 그것은 당신이 찾고있는 주소와 일치하게되었습니다.

인스턴스 변수의 내용이 아닌 인스턴스 변수 자체에 대한 포인터가있는 경우 수행 할 수 있습니다.

Foo * reference = [[Foo alloc] init];
Foo * foo == [[Foo alloc] init];
int * barptr = &(foo->bar);
Foo * baz = (Foo *)((char *)barptr - ((char *)(&(reference->baz)) - (char *)reference));
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top