创建新对象会在iOS中引发copywithzone无法识别的选择器错误
我有一个简单的对象,看起来像这样:创建新对象会在iOS中引发copywithzone无法识别的选择器错误,ios,objective-c,cocoa-touch,nsobject,Ios,Objective C,Cocoa Touch,Nsobject,我有一个简单的对象,看起来像这样: #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,
#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 <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
我得到以下错误:
*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[MyCycle copyWithZone:]: unrecognized selector sent to instance
为什么会发生这种情况?我如何修复它?在代码中的某个地方,有一个代码试图复制一个
MyCycle
实例。也许您使用对象作为字典的键?如果希望继续此行为,则需要为类实现。可能发生此错误的原因之一是您声明的变量名称或您的自定义类已被iOS SDK使用。你可以说这是一个关键词。变量名永远不能成为关键字,因为它会混淆您的XCode(Objective C编译器)。我知道这个问题已经回答了一段时间,但对于子孙后代来说,这里还有一个可能是原因。检查绑定。如果您意外地在Interface Builder中绑定了控制器,并且UI控件尝试将实际控制器用作字符串或其他值类型,从而导致发出copyWithZone:
,也会发生这种情况
例如,如果文件的所有者有一个嵌套的控制器,并且您意外地绑定到
innerController
,而不是innerController.property
这是一个老问题,但您可能还没有@synthesistedproperties“数据”、“myNumber”。换句话说,您没有这些属性的setter。发生这种情况是因为您没有向我们显示所有代码。您是否有用于MyCycle
的自定义init方法?你能把它贴出来吗?你还没有告诉我们发生故障的代码。您需要学习如何使用调试器查找故障点。发布实际导致错误的代码。因此,对于对象属性,我应该使用strong而不是copy?我把我使用“复制”的每个地方都改成了“强”,而且很有效。@Atma不,不,如果你想复制,没关系。只需实现实际副本。@Atma您发布的任何代码都没有问题。无需将任何copy
属性更改为retain
。用导致崩溃的实际代码更新您的问题。默认情况下,NSDictionary复制用作键的对象,对吗?在这种情况下,完成复制似乎是唯一的解决方案。@NicolasMiari但到目前为止,我们不知道是什么代码导致了问题,也不知道字典是否与MyCycle
对象一起用作键。
MyCycle *cycle = [[MyCycle alloc] init];
cycle.myNumber = @1;
cycle.data = [[NSArray alloc]init];
*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[MyCycle copyWithZone:]: unrecognized selector sent to instance