Objective c 无法识别的选择器已发送到实例,但我可以';我不明白为什么

Objective c 无法识别的选择器已发送到实例,但我可以';我不明白为什么,objective-c,ios,Objective C,Ios,这是我朋友在测试我的应用程序时遇到的错误,但我无法重现。我将从代码开始: 传输频率 @interface TransferFrequency : NSObject - (BOOL)isImmediate; // Other details... @end 转移频率 @implementation TransferFrequency // Other details... - (BOOL)isImmediate { return YES; } @end 转移 @interface Tr

这是我朋友在测试我的应用程序时遇到的错误,但我无法重现。我将从代码开始:

传输频率

@interface TransferFrequency : NSObject
- (BOOL)isImmediate;
// Other details...
@end
转移频率

@implementation TransferFrequency
// Other details...
- (BOOL)isImmediate
{
    return YES;
}
@end
转移

@interface Transfer : NSObject
@property (nonatomic, retain) TransferFrequency* frequency;
// Other details...
@end
转乘

@implementation Transfer
@synthesize frequency;
// Other details...
@end
CreateTransferView.h

@interface CreateTransferView : UITableViewController
@property (nonatomic, retain) Transfer* transfer;
// Other details...
@end
CreateTransferView.m

@implementation CreateTransferView
@synthesize transfer;

// Other details...

- (void)confirmButtonTouched
{
    // The crash happens on the following line, as confirmed by stack trace
    if([self.transfer.frequency isImmediate])
        // Do some stuff
}
@end
当用户触摸确认按钮时,将调用
confirButtoTouched
。这就是我朋友所犯的错误:

-[TransferFrequency isImmediate]: unrecognized selector sent to instance 0xeec6db0
在我看来,一个合法的
TransferFrequency
对象调用了选择器
isImmediate
,但iPhone说它找不到该选择器

实际上有几部iPhone向我报告了这个错误,但我没有任何一部iPhone的物理访问权限,所以我被远远地困在调试中。我自己的ipodtouch、iPhone和iPhone模拟器都工作得很好


关于可能导致这种情况的原因,您有什么想法吗?

首先,如果您正在使用断点运行调试器,您能否确认self.transfer确实已分配,并且在调用confirButtoTouch时表示传输的实例

我的想法:

1) 您正在命名一个以“Create”开头的类。Create带有一个带有方法名的约定,所以我尽量避免在一般情况下使用它(除非我特别想遵守约定)

2) 您可以尝试隔离ivar名称并显式分配它们: @合成*aTransfer=\uu aTransfer


我在这里的动机是,在某个地方/如何将类与实例混为一谈将与属性混为一谈。。。你有几个相似的名字被抛来抛去,我会尽可能地隔离所有的东西,因为我没有看到任何其他问题跳出。。。您可能会遇到一些名称冲突。

很抱歉浪费大家的时间。我的朋友正在自己的机器上分发应用程序进行测试。原来他需要清理和重建这个项目。现在效果很好


无论如何,谢谢大家的帮助。这里的教训是,如果你遇到了一个没有真正意义的问题,清理并重建

您是否在Transfer init方法中创建了频率对象,或者该对象是否从任何其他对象获得了TransferFrequency?(这与CreateTransferView.transfer的问题相同)?代码看起来不错,我能想象到的唯一会导致您描述的效果的问题是存储在
TransferFrequency
对象的
isa
指针中的调度表损坏。@TomaszWojtkowiak:CreateTransferView使用
[self-setTransfer:[[传输分配]初始化]]
。TransferFrequency对象是在用户选择一个对象时设置的。
self.transfer.frequency=someFrequencyObject
这听起来可能很愚蠢,但是出现问题的设备和工作的设备的CPU架构是什么?@TomaszWojtkowiak:
self.transfer.frequency
实际上不是零。但是,如果它是零的话nil,我不会遇到“无法识别的选择器”错误。我知道“创建”的命名约定,并且我已经确认,在类名中使用大写字母不会导致问题。我理解您更改ivar名称的动机,但如果问题发生在某些手机上,但没有,这可能是问题所在吗不是其他人吗?我不这么认为,但我也不认为只要看看这段代码就有问题。