2014-01-18 5 views
1

코드 id copiedData = [_localData copy]; 아래의 코드를 컴파일하면 "selector 'copy'에 대한 알려진 인스턴스 메서드가 없습니다."라는 오류가 발생합니다. _localDataid<IGTestClassData>이고 IGTestClassDataNSCopyingNSObject에 부합한다고 가정하면 copy 방법이없는 이유는 무엇입니까?NSCopying 및 NSObject를 준수하는 프로토콜에서 selector 'copy'에 대한 알려진 인스턴스 메서드가 없습니다.

IGTestClass.h 파일

#import <Foundation/Foundation.h> 

@protocol IGTestClassData<NSCopying, NSObject> 
    @property (nonatomic) NSString* localId; 
@end 

@interface IGTestClass : NSObject 
{ 
    @protected 
    id<IGTestClassData> _localData; 
} 

    -(void)doTest; 
@end 

IGTestClass.m 파일

#import "IGTestClass.h" 

@implementation IGTestClass 

-(instancetype)initWithLocalData:(id<IGTestClassData>)localData 
{ 
    self = [super init]; 
    if (self) 
    { 
     _localData = localData; 
    } 

    return self; 
} 

-(void)doTest 
{ 
    id copiedData = [_localData copy]; 
} 

@end 
+0

프로토콜이 "준수"하지 않습니다. 당신은 객체 클래스가 필요합니다. –

+0

프로토콜은 다른 프로토콜을 준수합니다. 거기에 문제 없습니다. –

답변

4

어느 프로토콜 NSCopying이나 프로토콜 NSObject-copy를 선언합니다.

NSCopying-copyWithZone:만을 선언합니다. 한 가지 해결책은 [_localData copyWithZone:nil]입니다.

클래스 NSObject에도 불구하고 NSObject-copy을 선언합니다. 한 가지 해결책은 귀하의 ivar을 타입 NSObject<IGTestClassData> *으로 선언하는 것입니다.