56

私のアプリケーションは次の理由でクラッシュしました:

- [MyClassName copyWithZone:] 認識されないセレクターがインスタンスに送信されました

私は2つのクラスを持っています。クラス1とクラス2としましょう。

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

**

クラス2は次のようになります

**

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:] 認識されないセレクターがインスタンスに送信されました

この問題を解決するにはどうすればよいですか?

4

2 に答える 2

76

メソッド-setObj1:はとして宣言されてcopyいるため、オブジェクトを呼び出し-copyますClass1-copyを呼び出すだけ-copyWithZone:nilです。したがって、NSCopyingプロトコルを実装する(つまり、を実装する-copyWithZone:)か、プロパティをからcopyに変更する必要がありますretain

于 2012-07-09T09:01:49.760 に答える
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;
}

これがお役に立てば幸いです。

参考

于 2012-07-09T09:06:21.587 に答える