-[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.
ReferenceURL : https://stackoverflow.com/questions/11391835/myclassname-copywithzone-unrecognized-selector-sent-to-instance
'development' 카테고리의 다른 글
네트워크 포트에서 수신하고 데이터를 텍스트 파일에 저장 (0) | 2021.01.10 |
---|---|
C ++에서 런타임 동안 동적으로 함수를 만들 수 있습니까? (0) | 2021.01.10 |
Java 패키지 이름이 소문자 여야하는 이유는 무엇입니까? (0) | 2021.01.10 |
Rmarkdown / knit에서 R 코드를 숨기고 결과 만 표시 (0) | 2021.01.10 |
병합 충돌을 해결 한 후 기본 git 커밋 메시지를 사용하는 방법은 무엇입니까? (0) | 2021.01.10 |