【问题标题】:unrecognized selector sent to instance [duplicate]无法识别的选择器发送到实例 [重复]
【发布时间】:2013-05-18 20:17:21
【问题描述】:

我已经开始在 cocos2d-iphone 中实现一个游戏了;我在我的项目中使用 ARC。

在我的Levelfinder.h 中声明的类的主要@interface 中,我声明了以下属性:

@property NSMutableArray* pineapples;

在我的主课中,我正在使用这个属性:

for (PineappleModel* pineapple in levelFileHandler.pineapples) 
{
    b2Body* body = [self createPineappleAt:
            [CoordinateHelper levelPositionToScreenPosition:pineapple.position]];
    body->SetLinearDamping(pineapple.damping);
    [pineapplesDict setObject:[NSValue valueWithPointer:body] 
                       forKey:[NSNumber numberWithInt: pineapple.id]];
}

但是当我运行我的代码时,我看到了以下运行时错误:

SIGABRT '-[LevelFileHandler setPineapples:]: unrecognized selector sent to instance 0x9431c60

我是cocos2d的新手,但是看了这个问题很久,卡住了。任何形式的帮助将不胜感激。


这里是LevelFileHandler.h

@interface LevelFileHandler : NSObject

@property NSMutableArray* pineapples;

@end

现在在我的LevelFileHandler.m 中,我已经像这样使用了我的菠萝属性

self.pineapples = [NSMutableArray arrayWithCapacity:5];
[self.pineapples addObject:pineappleModel]

很明显,这段代码的意图只是创建一个容量为 5 的数组。

【问题讨论】:

  • 在这个例子中你没有在任何地方调用setPineapples:。你确定这是错误所在吗?
  • 根据错误和您显示的代码,不太可能有人能够帮助您。请发布更多相关代码。 “setPineapples”在哪里被调用?如果这是错误,那么实际显示调用它的代码是有意义的。
  • 显示你的堆栈跟踪!!!跟踪将准确告诉您错误发生的位置。
  • LevelfileHandler.h >> Header FIle .. & LevelFileHandler 是我实现的类 ..@NateChandler
  • @Shaqir:您没有提供足够的信息来回答这个问题。当您获得SIGABRT 时,调试器会指示哪一行?崩溃时的stack trace 是什么? LevelFileHandler@interface 是在其中声明了pineapples 的地方导入到源文件LevelFileHandler.m 中,而LevelFileHandler@implementation 出现在哪里?您在编译期间是否收到任何警告?

标签: iphone objective-c cocos2d-iphone


【解决方案1】:

嗯,问题正是所说的。您尝试在未实现 setPineapples 的类对象上调用方法。似乎您尝试在 LevelFileHandler 类型的对象上调用 setPineapples,即使是类名,也不表明它与菠萝有关:P。

你没有在这段代码 sn-p 的任何地方调用这个方法。所以很难判断到底哪里出了问题。

注意意外分配。 UIKit 的示例是

UITextView text = [UITextView alloc] init];
//few lines later, you do this
text = [SomeClass returnStringAsIDType];
//crash sometime later as textView becomes a string.

由于 Objective-C 是动态类型的,任何将 id 类型的东西分配给具有错误类类型的变量(如果您期望的类型不是实际分配的类型)的任何分配,甚至都不会显示警告.你可能会花很多时间摸不着头脑,想知道为什么你的 UITextView 突然变成了一个 NSString,例如。

【讨论】:

  • 对的伙伴..我没有实现任何名为 SetPineapples 的方法。那是我真正的问题。 &我没有调用像 SetPineapples 这样的东西。
  • @Shaqir 你有一个名为pineapples 的属性没有标记为readonly,所以在任何具有该属性的类中都有一个隐式的-setPineapples: 方法。设置属性,如foo.pineapples = somePineaples; 是对-setPineapples: 方法的调用。如果您对这些信息不熟悉,请查看属性文档。
  • @Shaqir 此代码self.pineapples = [NSMutableArray arrayWithCapacity:5]; 等同于[self setPineapples:[NSMutableArray arrayWithCapacity:5]];
【解决方案2】:

看起来createPineappleAt: 中有类似[[self class] setPineapples:something] 的东西。

或者,原子引用可能存在问题。默认情况下,属性是原子的和合成的。你可以试试:

@interface LevelFileHandler : NSObject

@property (strong, nonatomic) NSMutableArray* pineapples;

@end

【讨论】:

  • 我认为您在这里草率下结论。 OP 没有提供足够的信息来判断 -setPineapples: 调用发生在哪里。
猜你喜欢
  • 1970-01-01
  • 2015-12-09
  • 2015-03-03
  • 1970-01-01
  • 2019-08-28
  • 2012-07-24
相关资源
最近更新 更多