2014-01-18 3 views
1

Когда я скомпилирую код ниже, строка id copiedData = [_localData copy]; приводит к ошибке компилятора «нет известного метода экземпляра для selector« copy ».» Учитывая, что _localData имеет тип id<IGTestClassData> и данный IGTestClassData соответствует как NSCopying, так и NSObject Почему у него нет метода copy?неизвестный метод экземпляра для селектора «копировать» по протоколу, соответствующему NSCopying и NSObject

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 заявляет -copy, хотя протокол NSObject нет. Одним из решений было бы объявить ваш ivar как тип NSObject<IGTestClassData> *.