在 iOS 中创建新对象时,会抛出“copywithzone”未识别选择器错误。

3

我有一个简单的对象看起来像这样:

#import <Foundation/Foundation.h>
#import <Parse/Parse.h>

@class MyUser;

@interface MyCycle : NSObject


@property (nonatomic, copy) NSNumber *myNumber;
@property (nonatomic, strong) MyUser *user;
@property (nonatomic, strong) NSArray *data;


@end

这是实现代码:
#import "MyCycle.h"

@implementation MyCycle



@end

这是用户对象:

#import <Foundation/Foundation.h>
#import <Parse/Parse.h>


@interface MyUser : NSObject

@property (nonatomic, copy) NSString *usersName;
@property (nonatomic, copy) NSString *gender;
@property (nonatomic, copy) NSString *email;
@property (nonatomic, copy) NSString *password;
@property (nonatomic, copy) NSString *phoneNumber;
@property (nonatomic, strong) UIImage *profileImage;
@property (nonatomic, strong) PFFile *profileImageFile;




@end

我分配这个对象并用以下内容填充它:

MyCycle *cycle = [[MyCycle alloc] init];
        cycle.myNumber = @1;
        cycle.data = [[NSArray alloc]init];

I get the following error:

*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[MyCycle copyWithZone:]: unrecognized selector sent to instance

为什么会发生这种情况,我该如何解决?

这是因为您没有向我们展示所有的代码。 - Hot Licks
你是否有一个自定义的 MyCycle 初始化方法?能否请您发布一下它? - Undo
你还没有向我们展示出现故障的代码。你需要学会使用调试器来找到故障点。 - Hot Licks
2
请发布实际导致错误的代码。 - rmaddy
4个回答

6

您的代码中有一行尝试复制MyCycle实例的代码。也许您使用一个对象作为字典的键?如果您希望继续这种行为,您需要为您的类实现NSCopying协议


所以对于对象属性,我应该使用strong而不是copy?我将每个使用copy的地方都改为strong,现在它可以工作了。 - Atma
@Atma 不不,如果你想复制那没问题。只需要实现实际的复制即可。 - Léo Natan
@Atma 你发布的代码没有任何问题,不需要将任何 copy 属性更改为 retain。请更新你的问题,并提供导致崩溃的实际代码。 - rmaddy
1
NSDictionary默认情况下会对用作键的对象进行复制,对吗?在这种情况下,实现复制似乎是唯一的解决办法。 - Nicolas Miari
实际上@rmaddy是正确的。一旦代码显示出来,我会在我的答案中添加。 - Léo Natan
显示剩余2条评论

0

这个错误发生的一个原因是,您声明的变量名称或自定义类名称已经被iOS SDK使用。可以说它是一个关键字。变量名称永远不能是关键字,因为它会让您的XCode(Objective C编译器)混淆。


0

我知道这个问题已经有答案了,但为了后人,这里提供一个可能的原因。检查你的绑定。如果你在Interface Builder中意外地将控制器绑定到UI控件并且UI控件试图使用实际控制器作为字符串或其他值类型,这也会发生,从而导致copyWithZone:被调用。

例如,如果File's Owner有一个嵌套的控制器,并且你意外地绑定到innerController而不是innerController.property


0

这是一个旧问题,但可能您还没有对属性“data”和“myNumber”进行@synthesized合成。换句话说,您没有为这些属性设置setter。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接