2012-02-21 15 views
1

これは私の友人が私のアプリケーションをテストするときに発生しているエラーですが、再現できません。私は、コードから始めましょう:インスタンスに送信されたセレクタが認識できませんが、理由がわかりません

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エミュレータはすべてうまく動作します。

何が原因である可能性がありますか?

+0

Transfer initメソッドで周波数オブジェクトを作成しましたか、このオブジェクトが他のオブジェクトからTransferFrequencyを取得していましたか? (CreateTransferView.transferと同じ質問です)? –

+0

コードはうまく見えますが、あなたが記述している効果につながると思う唯一の問題は、 'TransferFrequency'オブジェクトの' isa'ポインタに格納されているディスパッチテーブルの破損です。 – dasblinkenlight

+0

@ TomaszWojtkowiak:CreateTransferViewは '[self setTransfer:[[Transfer alloc] init]]'を使って 'viewDidLoad'に新しいTransferオブジェクトを作成します。 TransferFrequencyオブジェクトは、ユーザーが1つを選択すると設定されます。 'self.transfer.frequency = someFrequencyObject' – Aaron

答えて

0

皆さんのご迷惑をおかけして申し訳ありません。私の友人は自分のマシンからテストのためにアプリを配布しています。彼はプロジェクトを清掃して再建する必要があることが判明しました。今は素晴らしい作品です。

とにかく、助けてくれてありがとう。ここでの教訓は、あなたが本当に意味をなさない問題を抱えている場合は、きれいにして再構築することです!

2

まず、ブレークポイントでデバッガを実行している場合、confirmButtonTouchが呼び出されたときにself.transferが実際に割り当てられ、転送のインスタンスを表していることを確認できますか?

私の考え:

1)あなたが '作成' で始まるクラスを命名しています。 Createはメソッド名を持つ規約を持っているので、私は一般的にそれを使用しないようにしています(特に規約に準拠しない限り)。

2)ivar名を明示的に割り当ててください。 @synthesize * aTransfer = __aTransfer;

ここで私の動機は、クラスがインスタンスと混ざり合っていることと、プロパティと混ざり合っていることです...あなたはいくつかの類似の名前を投げかけていますが、私は可能な限りすべてを分離しようとします私は他の問題が飛び出すのを見ません...あなたはいくつかの名前の衝突を持つかもしれません。

+0

私は「作成」の命名規則を認識しています。クラス名に適切な大文字を使用しても問題は発生しないことを確認しました。そして私はivarの名前を変更するためのあなたの動機を理解していますが、それは問題がいくつかの電話で起こるが他のものではないときに問題になる可能性がありますか? – Aaron

+0

私はそうは思わないでしょうが、このコードを見るだけでこのコードに問題があるとは思わないでしょう。 – isaac

関連する問題