– 无法识别的select器发送到实例
我的应用程序崩溃的原因是:
– [MyClassName copyWithZone:]无法识别的select器发送到实例
我有两个class。 比方说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:]无法识别的select器发送到实例
我该如何解决这个问题?
您的-setObj1:
方法被声明为copy
,因此它调用Class1
对象上的-copy
。 -copy
只需要调用-copyWithZone:nil
。 所以你要么需要实现-copyWithZone:
协议(这意味着实现-copyWithZone:
,要么改变你的属性从copy
retain
。
为了让你的类响应copyWithZone:
,你必须在你的类中实现NSCopying
协议。 你必须重写copyWithZone:
方法。
例如:
首先你必须在你的接口声明中实现NSCopying协议。
@interface MyObject : NSObject <NSCopying>
然后重写copyWithZone
方法,
- (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; }
如果这能帮助你,我很高兴。
( 参考 )