- [MyClassName copyWithZone:] unrecognized selector sent to the instance

My application crashed due to:

- [MyClassName copyWithZone:] unrecognized selector sent to the instance

I have two classes. Let them say Class1 and Class2.

Class1 is as follows:

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 looks like

**

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 

Emergency situation

 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.. 

...

When I called [class2 setObj1:class1]; , the application crashed due to:

- [Class1 copyWithZone:] unrecognized selector sent to the instance

How can I fix this problem?

+48
class objective-c iphone copy crash
Jul 09 2018-12-12T00:
source share
2 answers

Your method -setObj1: declared as copy , so it calls -copy on your Class1 object. -copyWithZone:nil simply calls -copyWithZone:nil . Thus, you need to either implement the NSCopying protocol (which means the implementation of -copyWithZone: , or change your property from copy to retain .

+64
Jul 09 '12 at 9:01
source share

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

For example:

First you need to implement the NSCopying protocol in an interface declaration.

 @interface MyObject : NSObject <NSCopying> 

Then override the copyWithZone like method,

 - (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.

( Link )

+44
Jul 09 2018-12-12T00: 00Z
source share



All Articles