2013-05-06 1 views
2

[super dealloc]을 호출하고 수퍼 클래스에서 IMP를 가져 와서 호출하는 것의 차이점은 무엇입니까?[super dealloc] 호출과 수퍼 클래스의 메소드 구현 호출의 차이점

Method deallocMethod = class_getInstanceMethod([self superclass], @selector(dealloc)); 
IMP superImp = method_getImplementation(deallocMethod); 
((void (*)(id, SEL))superImp)(self, _cmd); 

내가 사용하는 용도에 따라 두 가지 다른 동작이 나타납니다. UIViewController 동적 하위 클래스에서이 다른 동작을보고 있습니다.

편집 :

이 정교합니다. ARC를 사용하지 않습니다.

또한 동작의 차이점은 설명하기 어렵지만 최선을 다할 것입니다. UIViewController가 dealloc에서 수행하는 일부 정리가 수행되지 않는 것처럼 보입니다. [super dealloc] 만 호출하면 할당 해제 된 뷰 컨트롤러의 인스턴스로 메시지가 전송됩니다. 이것은 UIViewController (+ [UIViewController setViewController : forView :])의 정적 함수에서 뷰 (뷰에 대한 뷰 컨트롤러의 해시가 커지기 때문에 발생합니다)가 발생합니다. 내 생각 엔보기 컨트롤러가 해시에서 제거되지 않는 경우에만 [super dealloc]을 호출합니다.

+1

ARC를 사용하는 경우 모든 베팅이 해제됩니다. –

+2

행동의 차이점은 무엇입니까? 증상이 무엇인지 알면 쉽게 설명 할 수 있습니다. –

+0

방금 ​​동작 차이에 대한 설명을 추가했습니다. 나는 정확히 무엇이 다른지 100 % 명확하지 않다. 여기에 대한 답변이 나에게 힌트를 줄 수 있기를 희망했지만 나는 그것을 설명하기 위해 최선을 다했다. – drewag

답변

1

ARC에서 [super dealloc]을 (를) 호출하지 마십시오. 그렇지 않으면 둘 다 동일합니다.

0

나는 사실상 수 시간의 인터넷 검색 및 책 페이지를보고, 수퍼 버전의 메소드를 호출하려고했지만 (컴파일 타임에 메소드의 이름을 알지 못함) 여기에왔다.

이것은 모두 그 것이 전부 나를 정리했다. 나는 함수 포인터 구문을 제외하고 약 90 %를 올바르게 가져 왔습니다.

((void (*)(id, SEL)) 부분은 제가 부족한 부분이었습니다.

나는 superImp (self, _cmd)과 동등한 작업을하고 있었고 어떻게 작동하는지 (디버거에서는 기능의 수퍼 클래스 버전이 실행 중임을 보여 주 었음) 디버거의 녹색 줄이 호출의 원래 줄로 돌아 왔을 때 계속 궁금해했습니다. 내가 얻고있다 EXC_BAD_ACCESS (code = 1, address = well...whatever)

호기심 많은 일 ... 나는 많은 함수 포인터에 대해 읽은 것을 기억하고 있으며,이 주제를 다룰 때 드루 그 구문은 의미가있다 ... 그러나 나는 많은 다른 주제들과 "IMP를 붙잡고 전화를 걸기 위해 간단하게 사용"의 라인을 따라 발행하십시오. 다른 주제에 대해 아무도 매개 변수의 특성 및 반환 유형에 대해 언급하지 않았습니다.

감사합니다.

관련 문제