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

Hai*_*Dog 1 objective-c nsobject nscopying

当我编译下面的代码行id copiedData = [_localData copy];导致编译器错误"没有已知的选择器'副本'的实例方法." 鉴于它_localData是类型id<IGTestClassData>和给定IGTestClassData符合两者NSCopying,NSObject为什么它没有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
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

Gre*_*ker 5

协议NSCopying和协议均未NSObject声明-copy.

NSCopying-copyWithZone:只声明.一种解决方案是打电话[_localData copyWithZone:nil].

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