iphone objective-c class crash copy

iphone - -[MyClassName copyWithZone:] selector no reconocido enviado a la instancia



objective-c crash (2)

Mi aplicación se bloqueó con el motivo:

- [MyClassName copyWithZone:] selector no reconocido enviado a la instancia

Tengo dos clases. Digamos Class1 y Class2.

Class1 se ve así:

Clase1.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 se ve como

**

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

Situación accidentada

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

...

Cuando llamé [class2 setObj1:class1]; , la aplicación se bloqueó con razón:

- [Class1 copyWithZone:] selector no reconocido enviado a la instancia

¿Como puedo solucionar este problema?


Para hacer que su clase responda a copyWithZone: debe implementar el protocolo NSCopying en su clase. Y debe anular el método copyWithZone:

Por ejemplo:

Primero, debe implementar el protocolo NSCopying en su declaración de interfaz.

@interface MyObject : NSObject <NSCopying>

A continuación, anule el método copyWithZone como,

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

Me alegro si esto te ayuda.

( Reference )


Su método -setObj1: se declara como copy , por lo que llama a -copy en su objeto Class1 . -copy simplemente llama -copyWithZone:nil . Por lo tanto, debe implementar el protocolo NSCopying (lo que significa implementar -copyWithZone: o cambiar su propiedad de copy para retain .