2012-02-21 8 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 
을 : 나는 코드로 시작합니다3210

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이 여러 개 있지만 실제 액세스 권한이 없으므로 멀리에서 디버깅을합니다. 내 자신의 아이팟 터치, 아이폰, 그리고 아이폰 에뮬레이터 모두 잘 작동합니다.

어떤 원인 일 수 있습니까?

+0

전송 초기화 메소드에서 빈도 객체를 만들었습니까? 아니면이 객체가 다른 객체에서 TransferFrequency를 얻었습니까? (이 동일한 질문 CreateTransferView.transfer)? –

+0

코드가 잘 보입니다. 설명하는 효과로 이어질 것이라고 생각할 수있는 유일한 문제는 'TransferFrequency' 객체의 isa 포인터에 저장된 디스패치 테이블의 손상입니다. – dasblinkenlight

+0

@TomaszWojtkowiak : CreateTransferView는'[self setTransfer : [[Transfer alloc] init]]'을 사용하여'viewDidLoad'에 새로운 Transfer 객체를 생성합니다. TransferFrequency 객체는 사용자가 하나를 선택할 때 설정됩니다. 'self.transfer.frequency = someFrequencyObject' – Aaron

답변

0

글쎄, 모든 사람의 시간을 낭비해서 죄송합니다. 내 친구가 자신의 컴퓨터에서 테스트 용 앱을 배포하고 있습니다. 그는 프로젝트를 청소하고 재건해야한다고 밝혀졌습니다. 이제 잘됩니다.

어쨌든 도움 주셔서 감사합니다. 그리고 여기서 교훈은 당신이 정말로 이해할 수없는 문제를 가지고 있다면, 깨끗하게하고 다시 짓는 것입니다!

2

먼저 디버거에서 중단 점을 실행하는 경우 confirmButtonTouch가 호출 될 때 self.transfer가 실제로 할당되고 전송의 인스턴스를 나타내는 지 확인할 수 있습니까?

내 생각 :

1) 당신은 '만들기'로 시작하는 클래스의 이름을 지정하고 있습니다. Create는 메서드 이름을 가진 규칙을 전달하므로 일반적으로이 규칙을 사용하지 않도록 노력합니다 (특히 규칙을 준수하기를 원하지 않는 한).

2) ivar 이름을 명시 적으로 지정하여 분리 해보십시오. @synthesize * aTransfer = __aTransfer;

여기 내 동기는 어딘가에/클래스가 인스턴스와 섞여있는 것과 속성이 섞여있는 것입니다 ... 비슷한 이름이 여러 개 있습니다. 가능한 한 모든 것을 격리하려고합니다. 다른 문제가 발생하는 것을 보지 못했습니다 ... 이름 충돌이있을 수 있습니다.

+0

'Create'의 명명 규칙을 알고 있고 클래스 이름에 적절한 대문자 사용으로 문제가 발생하지 않는다는 것을 확인했습니다. 그리고 ivar 이름을 변경하려는 동기를 이해하고 있지만 일부 전화기에서는 문제가 발생하지만 다른 장치에서는 그렇지 않을 때 문제가 될 수 있습니까? – Aaron

+0

나는 그렇게 생각하지 않겠지 만, 단순히이 코드를 보면서 문제가 있다고 생각하지 않을 것이다. – isaac

관련 문제