无法识别的选择器发送到实例,但我无法弄清楚为什么

时间:2012-02-21 18:25:48

标签: objective-c ios

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

TransferFrequency.h

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

TransferFrequency.m

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

Transfer.h

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

Transfer.m

@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

当用户触摸确认按钮时,会调用confirmButtonTouched。这是我朋友得到的错误:

-[TransferFrequency isImmediate]: unrecognized selector sent to instance 0xeec6db0

在我看来,选择器isImmediate是在合法的TransferFrequency对象上调用的,但是iPhone说它无法找到该选择器。

实际上有几个iPhone向我报告此错误,但我没有物理访问任何一个,所以我从远处调试。我自己的iPod touch,iPhone和iPhone模拟器都可以正常工作。

关于可能导致这种情况的任何想法?

2 个答案:

答案 0 :(得分:2)

首先,如果您正在使用断点运行调试器,您是否可以确认实际已分配self.transfer并在调用confirmButtonTouch时表示Transfer的实例?

我的想法:

1)您正在命名以“创建”开头的班级。 Create带有方法名称的约定,所以我尽量避免使用它(除非我特别想要符合约定)。

2)您可以尝试隔离您的ivar名称,明确指定它们: @synthesize * aTransfer = __aTransfer;

我在这里的动机是某个地方/如何将类与实例混合在一起与属性混合......你有几个相似的名字被抛到一边,我会尽可能地把所有东西都隔离开来我没有看到任何其他问题跳出来......你可能会发生一些名称冲突。

答案 1 :(得分:0)

嗯,很遗憾浪费每个人的时间。我的朋友正在分发应用程序以便从他自己的机器进行测试。事实证明,他需要清理和重建项目。现在效果很好。

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