Ma candidature s'est bloquée avec la raison:
- [MyClassName copyWithZone:] sélecteur non reconnu envoyé à l'instance
J'ai deux classes. Disons Class1 et Class2.
La classe 1 ressemble à:
@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
@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
**
La classe 2 ressemble
**
#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
@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..
...
Quand j'ai appelé [class2 setObj1:class1];
, l'application s'est bloquée avec raison:
- [Class1 copyWithZone:] sélecteur non reconnu envoyé à l'instance
Comment puis-je résoudre ce problème?
Votre -setObj1:
la méthode est déclarée comme copy
, donc elle appelle -copy
Sur ton Class1
objet. -copy
appelle simplement -copyWithZone:nil
. Vous devez donc soit implémenter le protocole NSCopying
(ce qui signifie implémenter -copyWithZone:
) ou modifiez votre propriété de copy
à retain
.
Pour que votre classe réponde à copyWithZone:
, vous devez implémenter le protocole NSCopying
dans votre classe. Et vous devez remplacer le copyWithZone:
méthode.
Par exemple:
Vous devez d'abord implémenter le protocole NSCopying dans votre déclaration d'interface.
@interface MyObject : NSObject <NSCopying>
Remplacez ensuite la méthode copyWithZone
comme,
- (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;
}
Je suis content si cela vous aide.
( Référence )