ARC가 메서드 서명 정보를 가져 오는 위치를 파악하려고합니다. 다음 코드에서이 클래스의 클래스를 지정하지 않고이 객체의 부모에게 메시지를 보냅니다. 상위 ivar을 타입 변환하지 않으면 컴파일러에서 경고를 표시합니다. ID로 형식 변환하면 프로그램이 작동하고 경고가 표시되지 않습니다. 부모의 방법은 userSelected:
에 다른 경우 내가 (경고를 발행하면서) 다음 를 작동하는 유일한 것은 performSelector
입니다 performSelector:withObject:
ARC 및 컴파일 타임에 클래스를 지정하지 않고 개체에 메시지 보내기
를 사용하는 경우에도 마찬가지 입니다.
알다시피, ARC는 self.parent에 대한 호출이 객체에서 메소드 서명을 받고 있습니다. 이 올바른지? 메시지가 전송되는 객체에 메서드 시그니처가 있으면 객체가 어떤 클래스인지 ARC에 알리지 못합니까?
- (void)userSelected:(id)sender
{
if ([self.parent respondsToSelector:@selector(userSelected:)]) {
//1: This fails with error (no visible interface).
[self.parent userSelected:self];
//2: This line works without warnings.
[(id)self.parent userSelected:self];
//3: This line also works
[self.parent performSelector:@selector(userSelected:)
withObject:self];
}
경고 메시지가 표시됩니다. –