本文介绍了 - [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.h
#importClass2。 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];
时,应用程序崩溃的原因:
如何解决这个问题? -setObj1:
方法声明为
copy ,因此在 Class1
对象上调用 -copy
-copy
只是调用 -copyWithZone:nil
。所以你需要实现 NSCopying
协议(这意味着实现 -copyWithZone:
),或者更改你的属性从 copy
到 retain
。
My application crashed with the reason:
I have two classes. Let's say Class1 and Class2.
Class1 looks like:
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.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
Crashed 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 with reason:
How can I fix this problem?
解决方案
Your -setObj1:
method is declared as copy
, so it calls -copy
on your Class1
object. -copy
just calls -copyWithZone:nil
. So you either need to implement the NSCopying
protocol (which means implementing -copyWithZone:
), or change your property from copy
to retain
.
这篇关于 - [MyClassName copyWithZone:]无法识别的选择器发送到实例的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!