-[MyClassName copyWithZone:] 消息发送到实例时未识别的选择器

58

我的应用程序因为以下原因崩溃:

-[MyClassName copyWithZone:]无法识别发送给实例的选择器

我有两个类:Class1和Class2。

Class1的代码如下:

Class1.h

@interface Class1 : NSObject {
    NSString *imagemd5CheckSum;
    UIImage *image;
    NSData *fileChunkData;
}

@property (nonatomic, copy)NSString *imagemd5CheckSum;
@property (nonatomic, copy)UIImage *image;
@property (nonatomic, copy)NSData *fileChunkData;

@end

Class1.m

@implementation Class1

@synthesize image;
@synthesize fileChunkData;
@synthesize imagemd5CheckSum;

-(id) init{
    [self setImage:nil];
    [self setFileChunkData:nil];
    [self setImagemd5CheckSum:@""];

    return self;
}

-(void)dealloc{
    [imagemd5CheckSum release];
    [image release];
    [fileChunkData release];

    fileChunkData = nil;
    imagemd5CheckSum = nil;
    image = nil;

    [super dealloc];
}
@end

**

Class2的样子看起来像这样:

**

Class2.h


#import "Class2.h"
@interface Class2 : NSObject {
    Class1 *obj1;
    Class1 *obj2;
    Class1 *obj3;
}

@property (nonatomic, copy)Class1 *obj1;
@property (nonatomic, copy)Class1 *obj2;
@property (nonatomic, copy)Class1 *obj3;

@end

Class2.m


@implementation Class2

@synthesize obj1,obj2,obj3;

-(id) init{
    [self setObj1:nil];
    [self setObj2:nil];
    [self setObj3:nil];

    return self;
}

-(void)dealloc{
    [obj1 release];
    [obj2 release];
    [obj3 release];

    obj1 = nil;
    obj2 = nil;
    obj3 = nil;

    [super dealloc];
}
@end

崩溃情况

Class2 *class2 = [[Class2 alloc] init];

Class1 *class1 = [[Class1 alloc] init];

[class1 setImagemd5CheckSum:@"this is md5"];
[class1 setImage:myimage];
[class1 setFileChunkData:myData];

[class2 setObj1:class1]; // This line is crashed..
当我调用 [class2 setObj1:class1]; 时,应用程序崩溃并出现以下原因:

-[Class1 copyWithZone:] 无法识别的选择器发送到实例

如何解决这个问题?
2个回答

76

你的-setObj1:方法被声明为copy,因此它在你的Class1对象上调用-copy-copy方法只是调用了-copyWithZone:nil。所以你需要实现NSCopying协议(也就是要实现-copyWithZone:方法),或者将属性从copy改为retain


53
为了使你的类响应copyWithZone:,你需要在你的类中实现NSCopying协议。并且你必须重写copyWithZone:方法。
例如: 首先,你必须在接口声明中实现NSCopying协议。
@interface MyObject : NSObject <NSCopying>

然后重写copyWithZone方法,如下:

- (id)copyWithZone:(NSZone *)zone
{
    id copy = [[[self class] alloc] init];

    if (copy)
    {
        // Copy NSObject subclasses
        [copy setVendorID:[[self.vendorID copyWithZone:zone] autorelease]];
        [copy setAvailableCars:[[self.availableCars copyWithZone:zone] autorelease]];

        // Set primitives
        [copy setAtAirport:self.atAirport];
    }

    return copy;
}

如果这对你有帮助,我很高兴。

(参考)


2
我认为在这个讨论中必须提到区域参数已经被弃用的事实。 - abbood
20
嘿,你好啊。你是不是从这个答案中复制了你的代码?那些关于机场和汽车的东西是什么意思? - abbood
3
请看新增的参考资料,你将会了解到有关机场和汽车方面的所有内容。 - P Griep

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接