development

-[MyClassName copyWithZone :] 인식 할 수없는 선택기가 인스턴스로 전송되었습니다.

big-blog 2021. 1. 10. 19:48
반응형

-[MyClassName copyWithZone :] 인식 할 수없는 선택기가 인스턴스로 전송되었습니다.


내 응용 프로그램이 다음과 같은 이유로 충돌했습니다.

-[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 :] 인식 할 수없는 선택기가 인스턴스로 전송되었습니다.

이 문제를 어떻게 해결할 수 있습니까?


귀하의 -setObj1:방법은 다음과 같이 선언 copy이 호출, 그래서 -copy당신에 Class1객체입니다. -copy그냥 전화 -copyWithZone:nil. 따라서 NSCopying프로토콜 을 구현하거나 (구현을 의미 함 -copyWithZone:) 속성을에서 copy변경해야합니다 retain.


To make your class respond to copyWithZone:, you have to implement the NSCopying protocol in your class. And you must override the copyWithZone: method.

For example:

First you have to implement the NSCopying protocol in your interface declaration.

@interface MyObject : NSObject <NSCopying>

Then override the copyWithZone method like,

- (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;
}

I am glad if this helps you.

(Reference)

ReferenceURL : https://stackoverflow.com/questions/11391835/myclassname-copywithzone-unrecognized-selector-sent-to-instance

반응형