Objective c 已将无法识别的选择器发送到实例
事实上,问题在于Objective c 已将无法识别的选择器发送到实例,objective-c,Objective C,事实上,问题在于 @property(非原子,复制)NSMutableArray*arrayOfObjects 应该是: @property(非原子,强)NSMutableArray*arrayOfObjects 是 啊谢谢,谢谢你们 我不太明白这个bug是如何工作的,但我会尽力去了解:) 一个多小时以来我一直在努力解决一个问题。。。恐怕这件事很简单,但我还不明白。我猜这是内存管理的东西,因为这是我的弱点 帖子有点像 还有一些人,但他们没有解决我的问题 简而言之(粘贴很多原因不知道潜在的bug
@property(非原子,复制)NSMutableArray*arrayOfObjects代码>
应该是:
@property(非原子,强)NSMutableArray*arrayOfObjects代码>
是 啊谢谢,谢谢你们
我不太明白这个bug是如何工作的,但我会尽力去了解:)
一个多小时以来我一直在努力解决一个问题。。。恐怕这件事很简单,但我还不明白。我猜这是内存管理的东西,因为这是我的弱点
帖子有点像
还有一些人,但他们没有解决我的问题
简而言之(粘贴很多原因不知道潜在的bug在哪里):
//////////////////////////////////
#import "MyCustomObject.h"
@implementation MyCustomObject
@synthesize name;
@synthesize birthDay;
@synthesize heightInMeters;
-(id)initWithDate:(int)bd AndName:(NSString *)nameString AndHeight:(double)h{
if(self = [super init]){
self.birthDay = bd;
self.name = nameString;
self.heightInMeters = h;
return self;
}
return nil;
}
@end
以及用于MyCustomObject
s的某种数据库:
数据收集.h:
@interface DataCollection : NSObject{
NSMutableArray* arrayOfObjects;
}
@property (nonatomic, copy) NSMutableArray* arrayOfObjects;
-(void)addElement:(id)el;
@end
和执行:
#import "DataCollection.h"
@implementation DataCollection
@synthesize arrayOfObjects;
-(id)init{
if(self = [super init]){
self.arrayOfObjects = [[NSMutableArray array] init];
NSLog(@"Number of record before init: %d", [self.arrayOfObjects count]);
[self addElement:[[MyCustomObject alloc] initWithDate:1988 AndName:@"Georg" AndHeight:1.88]];
[self addElement:[[MyCustomObject alloc] initWithDate:1951 AndName:@"Sebastian" AndHeight:1.58]];
NSLog(@"Number of record before init: %d", [self.arrayOfObjects count]);
return self;
}
return nil;
}
-(void)addElement:(id)el{
// UNRECOGNIZED SELECTOR ????
[self.arrayOfObjects addObject:el];
}
@end
结果是:
2013-03-05 15:42:56.826 XMLTest[11787:207]之前的记录数
初始化:0当前语言:自动;当前目标-c 2013-03-05
15:43:51.446 XMLTest[11787:207]-[\uu NSArrayI addObject:]:无法识别
选择器已发送到实例0x6816110
你知道我做错了什么吗?我猜这是关于内存管理的问题,我没有读过你的问题——太长了,但我想我可能知道你的问题。仅查看文章末尾的调试器输出,看起来您正试图将addObject:
发送到NSArray
对象。如果要向数组中添加和删除对象,则需要使用NSMutableArray
。我实际上没有阅读您的问题-太长了,但我想我可能知道您的问题。仅查看文章末尾的调试器输出,看起来您正试图将addObject:
发送到NSArray
对象。如果要向数组添加和删除对象,则需要使用NSMutableArray
。如果更改
@property (nonatomic, copy) NSMutableArray* arrayOfObjects;
到
如果你改变了,这会解决你的问题
@property (nonatomic, copy) NSMutableArray* arrayOfObjects;
到
这应该可以解决您的问题为什么使用(非原子,复制)而不是(非原子,强)?或者至少(非原子,保留)
,这可能是您的问题,当您分配self.arrayOfObjects=blah
时,它在NSMutableArray
上调用copy
,它可能会返回一个数组的不可变副本,说明您为什么使用(非原子,复制)和不使用(非原子,强)?或者至少是(非原子,保留)
这可能是您的问题,当您分配self.arrayOfObjects=blah
时,它正在调用NSMutableArray
上的copy
,它可能返回数组的不可变副本。您应该提到,copy
将创建一个不可变副本(因此OP看到了错误)是的,正如trojanfoe所说,当@property指令设置为copy时,getter方法将实际复制arrayOfObjects,但它将是一个NSArray,而不是NSMutableArray。NSArray没有实现addObject:方法,因此导致无法识别sed选择器错误。您应该提到,copy
将创建一个不可变的副本(因此OP看到的错误)是的,正如trojanfoe所说,当@property指令设置为copy时,getter方法将实际复制arrayOfObjects,但它将是一个NSArray,而不是NSMutableArray。NSArray没有实现addObject:方法,因此导致无法识别sed选择器错误。是的,这确实是一个狡猾的问题。:)关键是-信任调试器消息,跟踪它们。这将引导您找到“为什么我的可变数组被转换为数组?”这将导致您的答案:是的,经过一些研究和学习,我发现你的答案还不错:啊,这肯定是个狡猾的问题。:)关键是-信任调试器消息,跟踪它们。这将引导您找到“为什么我的可变数组被转换为数组?”这将导致您的答案:是的,经过一些研究和学习,我发现你的答案还不错:D
@property (nonatomic, strong) NSMutableArray* arrayOfObjects;