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

Sha*_* TK 54 iphone crash copy class objective-c

我的应用程序崩溃的原因是:

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

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

**

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

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

崩溃的情况

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

...

当我打电话时[class2 setObj1:class1];,应用程序崩溃了原因:

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

我该如何解决这个问题?

Wev*_*vah 72

您的-setObj1:方法被声明为copy,因此它会调用-copy您的Class1对象.-copy只是打电话-copyWithZone:nil.因此,您需要实现NSCopying协议(这意味着实现-copyWithZone:),或者将属性更改copyretain.


小智 52

要让您的课程做出回应copyWithZone:,您必须NSCopying在课堂上实施该协议.你必须覆盖该copyWithZone:方法.

例如:

首先,您必须在接口声明中实现NSCopying协议.

@interface MyObject : NSObject <NSCopying>
Run Code Online (Sandbox Code Playgroud)

然后覆盖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;
}
Run Code Online (Sandbox Code Playgroud)

如果这有助于你,我很高兴.

(参考)

  • 嘿伙计..你从[this](http://stackoverflow.com/a/4089372/766570)的答案中复制了你的代码吗?这个机场和汽车的东西到底是什么? (19认同)
  • 看看添加的参考文献.你会发现机场和汽车的所在地. (3认同)
  • 我认为在本次讨论中必须提到区域参数为[已弃用](http://stackoverflow.com/questions/7934142/why-zone-is-allway-nil-while-implementing-nscopying)的事实 (2认同)