Mac에서 ARC를 사용하여 respondsToSelector를 사용할 수 없음


83

respondsToSelectorARC 환경에서 전화 하면 다음과 같은 오류 메시지가 나타납니다.Automatic Reference Counting Issue No known instance method for selector respondsToSelector:

이것은 헤더입니다

#import <AppKit/AppKit.h>


@class MTScrollView;

@protocol MTScrollViewDelegate
-(void)scrollViewDidScroll:(MTScrollView *)scrollView;
@end


@interface MTScrollView : NSScrollView 
{

}

@property(nonatomic, weak) id<MTScrollViewDelegate>delegate;

@end

이것은 구현 파일입니다.

#import "MTScrollView.h"

@implementation MTScrollView

@synthesize delegate;


- (void)reflectScrolledClipView:(NSClipView *)aClipView
{
    [super reflectScrolledClipView:aClipView];

    if([delegate respondsToSelector:@selector(scrollViewDidScroll:)])
    {
        [delegate scrollViewDidScroll:self];
    }
}

@end

이 오류가 발생하는 이유에 대한 제안 사항이 있습니까?

답변:


276

프로토콜이 NSObject를 준수하도록합니다.

@protocol MTScrollViewDelegate <NSObject>

그렇지 않으면 컴파일러는 객체가와 같은 NSObject 메시지에 응답 할 것이라고 생각하지 않고 respondsToSelector경고를 생성합니다. 어느 쪽이든 문제없이 런타임에 성공합니다.


2
@piobyz respondsToSelector는 인스턴스 메서드 NSObject이므로 시스템은 대리자가 하위 클래스의 일부임을 알아야합니다.NSObject
David

1
@David 감사합니다, 맞아요. 추가로 여기에 더 많은 정보가 있습니다 : stackoverflow.com/questions/1304176/…
Piotr Byzia

2
ARC 이전의 "오래된 세계"에서 @piobyz 컴파일러는 사용자가 수행중인 작업을 알고 있다고 가정하고 컴파일 시간에 일부 항목을 무시했습니다. 이제 ARC가 유지 및 릴리스를 관리합니다. 메서드가 있는지 확인하려면 프로젝트에서 메서드를 찾아야합니다. id로 작업하는 동안 컴파일러는 기호를 찾을 수 없습니다. 프로토콜을 NSObject로 제한함으로써 ARC는 가능한 모든 델리게이트가 "respondsToSelector"를 포함한다는 것을 정확히 알고 있습니다. 이렇게하면 일관성이 보장되고 메모리 관리는 항상 정상입니다. NSObject와 일치하지 않는 클래스는 델리게이트로 사용하면 오류가 발생합니다.
JackPearse 2012

1
@piobyz : respondsToSelector:NSObject 프로토콜의 일부 이기 때문 입니다. 이 delegate속성은으로 선언되어 id <MTScrollViewDelegate>델리게이트가 해당 프로토콜에서 선언 된 메시지에 응답한다는 것을 나타냅니다. 따라서 컴파일러가 NSObject 프로토콜을 준수하도록 해당 프로토콜이 필요 respondsToSelector:합니다.
Peter Hosey 2012

1
@David : 그렇지 않습니다. delegate클래스 이름으로 선언되지 않았으므로 NSObject 클래스는 여기서 관련이 없습니다. 컴파일러는이 두 가지가 관련되어 있다는 사실을 알지 못하며 여전히 알지 못합니다. 솔루션의 일부인 "NSObject"는 NSObject 프로토콜respondsToSelector: 입니다. 그 위치 가 선언되어 있기 때문입니다 . developer.apple.com/library/mac/documentation/Cocoa/Reference/…
Peter Hosey

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.