2014-02-10 6 views
1

다음 메소드가 있습니다. 나는 현재 try/catch 블록을 사용하여 인수가 클래스인지 프로토콜인지를 확인하고 메모리 누수의 원인 인 것처럼 보입니다. x이 클래스인지 프로토콜인지를 확인하는 올바른 방법은 무엇입니까?인수가 클래스인지 프로토콜인지 확인하십시오.

[self _injectMacro:[MyClass class]]; 
[self _injectMacro:@protocol(MyProtocol)]; 

+ (id)_injectMacro:(id)x 
{ 
    @try { 
     return NSStringFromProtocol(x); 
    } 
    @catch (NSException *exception) { 

    } 

    @try { 
     return NSStringFromClass(x); 
    } 
    @catch (NSException *exception) { 

    } 

    return nil; 
} 
+0

클래스/프로토콜이 존재하지 않는 경우 어떤 일이 발생하는지 어느 방법 문서를. 오늘 코드가 작동하더라도 내일이 아닐 수도 있습니다. –

+0

코코아는 일반적으로 예외 안전하지 않습니다. 잡기를 계속하면 메모리 누수와 같은 문제가 발생할 수 있습니다. 반면에, 이러한 함수는 내가 아는 한 예외를 던지지 않습니다. 이 코드가 실제로 예상 한대로 작동합니까? –

+0

@ JoshCaswell Thanks. 당신은 내 코드가 항상 첫 번째 시도를 통해 진행되고 있다는 것과 맞습니다. 두 try-catch의 장소를 바꿨을 때 EXC_Bad_Access를 던지기 시작했기 때문에 예외를 잡기가 정말로 어려웠습니다 – aryaxt

답변

3

당신은 id이 프로토콜인지 여부를 찾을 isKindOfClass를 사용할 수 있습니다

id x = [NSObject class]; 
id y = @protocol(NSObject); 
NSLog(@"%d", [x isKindOfClass:[Protocol class]]); // 0 
NSLog(@"%d", [y isKindOfClass:[Protocol class]]); // 1 

당신은 Protocol 사용하도록 ObjectiveC.Protocol 모듈을 가져올 수 있습니다

@import ObjectiveC.Protocol; 

또는 경우를 모듈을 사용하지 않는 경우 프로토콜 헤더를 가져 오세요.

id이 클래스 또는 인스턴스가 모습 한 경우
#import <objc/Protocol.h> 

확인하는 this answer

+0

그 가져 오기에 대한 컴파일 오류를 얻는다. 프로그램에서 예기치 않은 '@' – aryaxt

+2

그것은 새로운 모듈 구문입니다. '#import ', @aryaxt를 시도하십시오. –

+0

@ JoshCaswell가 작동하지 않는 것 같아요, 작동 했나요? – aryaxt

관련 문제