【问题标题】:Why is Xcode complaining about "unrecognized selector sent to instance" error?为什么 Xcode 抱怨“无法识别的选择器发送到实例”错误?
【发布时间】:2014-10-30 00:40:52
【问题描述】:

首先让我说我知道错误的含义。这基本上是在没有该方法的对象上调用了 Selector 方法。

无论如何,这是我的 Tile.h 头文件:

#import <Foundation/Foundation.h>
#import "Weapon.h"
#import "Armor.h"


@interface Tile : NSObject

@property (strong, nonatomic) NSString *story;
@property (strong, nonatomic) Weapon *weapon;
@property (strong, nonatomic) Armor *armor;
@property (nonatomic) int healthEffect;

@end

这是我的 Factory.h 头文件:

#import <Foundation/Foundation.h>


@interface Factory : NSObject

- (NSArray *)tiles;

@end

这是我的 Factory.m 文件:

#import "Factory.h"
#import "Tile.h"

@implementation Factory

- (NSArray *) tiles
{
    Tile *tile7 = [ [Tile alloc] init];
    tile7.story = @"blah blah";
    tile7.healthEffect = 8;
}
@end

Factory.m 文件中排除了一些代码,因为它们很简单,但如果我尝试编译和运行,我会收到以下错误:

2014-10-29 17:26:27.944 Pirate Adventure[718:15257]
-[Tile setHealthEffect:]: unrecognized selector sent to instance 0x7b03b8e0
2014-10-29 17:26:27.946 Pirate Adventure[718:15257] *** Terminating app due to uncaught 
exception 'NSInvalidArgumentException', reason: '-[Tile setHealthEffect:]: unrecognized 
selector sent to instance 0x7b03b8e0'

当我尝试设置 tile7.healthEffect = 8 时它在抱怨;

我什至不明白为什么它会抱怨 setHealthEffect 方法,我什至在我的 Tile.h 头文件中都没有这个定义。另外,healthEffect 只是 tile 对象的一个​​属性,所以我应该能够将它设置为我想要的任何整数值,而不必定义一个方法来设置正确的值?

我很困惑。

谢谢!

添加 Tile.m 文件:

#import "Tile.h"

@implementation Tile

@synthesize healthEffect = _healthEffect;

@end

【问题讨论】:

  • 当我查看您的tiles 方法时,只是一个小问题。您指定了NSArray * 的返回类型,但在实际实现中没有返回语句。为了让我们给您答案,您可能需要编辑帖子以包含您实际设置 healthEffect 的代码
  • 对不起,我确实返回了tiles数组,只是没有包含在里面
  • 我重新创建了您的情况,但我的代码使用您提供的相同方法/实现/类可以正常工作。错误可能是由与tile7.healthEffect = 8 不同的行引起的吗?如果不是,则错误是由您未能包含的代码引起的。我还会根据错误消息告诉您该方法是由类而不是对象调用的可能性来检查 tile7 的干扰多态性或多个声明。

标签: objective-c xcode xcode6


【解决方案1】:

线

tile7.healthEffect = 8;

只是

的语法 shugar
[tile7 setHealthEffect: 8];

如果您在类中有@property 声明,编译器通常会自动为您生成setter setHealthEffect 和getter healthEffect 以及实例变量_healthEffect,除非您自己创建它们。

我怀疑您的问题出在 Tile.m 中。你也可以分享一下吗?

【讨论】:

  • 是的,由于某种原因,setter 尚未生成。我已经忘记了它何时自动生成,不再自动生成,因为他们已经多次更改规则。但很可能 OP 有一个 @synthesize 代表 healthEffect,这让 Applecart 感到不安。
【解决方案2】:

问题不在于您迄今为止与我们共享的代码。出于某种原因,您的二传手根本没有被合成。请分享您的Tile 实施。例如,如果出现以下任一情况,您将收到此类错误:

  • healthEffect 是在Tile 类使用的协议中声明的属性;或

  • 您的 Tile 实现有一行明确声明不应合成该属性:

    @dynamic heathEffect;
    

你继续问:

由于某种原因,您的 setter 根本没有被合成。

我什至不明白它为什么抱怨 setHealthEffect 方法,我什至在我的 Tile.h 头文件中都没有这个定义。

正如 Klaus 所指出的,使用tiles.healthEffect = ... 等同于调用setHealthEffect

另外,healthEffect 只是 tile 对象的一个​​属性,所以我应该能够将它设置为我想要的任何整数值,而无需定义设置值的方法吗?

正确。这个setHealthEffect 方法应该已经自动为你合成了。从 Xcode 4.4 版开始,这些 setter 已经为我们合成了。您的问题中没有任何内容表明为什么在这种情况下没有为您合成此 setter。

【讨论】:

  • 更新了我的帖子,我的 Tile.m 文件中没有任何内容。代码没有为我自动合成。奇怪的是我还有另一个文件,它采用另一个非原子属性整数变量,并且在没有合成的情况下工作正常
  • 很难猜测没有看到更多,因为这里没有任何东西可以说明为什么它没有自动为您合成。一些最终建议: 1. 尝试清除“派生数据”文件夹并重新启动 Xcode 并确保没有一些奇怪的状态问题。 2. 尝试重现您描述的MCVE 问题,因为在我们能够重现之前,不可能修复它。我无法重现您描述的行为。
  • 感谢罗布的建议。我会尝试一些事情并回复你。
  • 你好 Rob,我更新了我的 Tile.m 文件以仅包含代码“@synthesize healthEffect = _healthEffect”并且它有效。我还是不明白为什么??
  • 也没有向我扑过来。自动综合发生在 Xcode 4.4 及更高版本中,除非您使用 @dynamic 或该属性是从协议继承的。但在你的例子中,这些似乎都没有发挥作用。同样,在您向我们展示可重现的示例之前,我无法帮助您。如果您在问题中仅使用代码创建测试项目,则问题不会表现出来。它必须是项目中的其他内容。
猜你喜欢
  • 1970-01-01
  • 2014-03-24
  • 1970-01-01
  • 2012-04-04
  • 1970-01-01
  • 1970-01-01
  • 2019-08-19
  • 1970-01-01
相关资源
最近更新 更多