2

当我编译下面的代码时,id copiedData = [_localData 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
4

1 回答 1

6

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

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

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

于 2014-01-18T02:47:20.553 回答