在符合 NSCopying 和 NSObject 的协议上没有用于选择器'copy'的已知实例方法



当我编译该行下面的代码时id copiedData = [_localData copy];会导致编译器错误"选择器'copy'没有已知的实例方法"。既然_localData属于id<IGTestClassData>类型,并且IGTestClassData同时符合NSCopyingNSObject为什么它没有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
协议

NSCopying和协议NSObject都没有声明-copy

NSCopying仅声明-copyWithZone:。一种解决方案是调用[_localData copyWithZone:nil]

NSObject 声明-copy即使协议 NSObject 没有。一种解决方案是将您的 ivar 声明为 NSObject<IGTestClassData> * 型 .

最新更新