2011-01-02 10 views
1

クラスMyUtilsにクラス関数(宣言され実装されている)があります。 この関数を呼び出すと、アプリがクラッシュします。デバッガでは、 "theFunction"関数の最初のアクションにブレークポイントがあります。そして、このブレークポイントに決して達しません。ここでObjective-CとCocoa:関数を入力せずにクラス関数を呼び出すとクラッシュする

コードです:

// ================================================================================================= 
// MyUtils.m 
// ================================================================================================= 
+ (NSString*) changeDateFormat_fromFormat:(NSString*)sourceFormat sourceDateString:(NSString*)sourceDateString destFormat:(NSString*)destFormat { 
    if (sourceDateString == nil) return (nil); **<-- breakpoint here** 

    NSDate* aDate = [NSDate dateFromString:sourceFormat theDateString:sourceDateString]; 
    return ([aDate stringValueWithFormat:destFormat]); 
} 

// =================================================================== 
// MyUtils.h 
// =================================================================== 
@interface MyUtils 
+ (NSString*) changeDateFormat_fromFormat:(NSString*)sourceFormat sourceDateString:(NSString*)sourceDateString destFormat:(NSString*)destFormat; 
+ (void) simpleAlert_ok:(NSString*)alertTitle message:(NSString*)alertMessage; 

@end 


// =================================================================== 
// Elsewhere.m 
// =================================================================== 
- (void) aFunction:(SomeClass*)someParam { 
    SomeOtherClass* val = nil; 
    NSString* intitule = nil; 


    intitule = [MyUtils changeDateFormat_fromFormat:@"yyyyMMdd" sourceDateString:@"toto" destFormat:@"EEEE dd MMMM yyyy"]; **<-- crash here** 

コンソール言う:

2011-01-03 02:05:07.188 Learning Project[1667:207] *** NSInvocation: warning: object 0xe340 of class 'MyUtils' does not implement methodSignatureForSelector: -- trouble ahead 
2011-01-03 02:05:07.188 Learning Project[1667:207] *** NSInvocation: warning: object 0xe340 of class 'MyUtils' does not implement doesNotRecognizeSelector: -- abort 

私はNSString *item = @"youyou";で呼び出しを置き換える場合は、すべてがOKです。

コールが何も変更されない前に、前のNSStringに保持を強制します。 何が起こっているのか考えていますか?

+1

もっとコードを表示できますか?私は、「MyUtils」はシングルトンだと推測しています。あれは正しいですか? – Moshe

+2

これは実際のコードではありません。モックの例を作成する際に、クラッシュする実際のコードの重要な部分を見逃している可能性があります。あなたが実際に使っているものを見せてください。 –

+0

@Mosheいいえ、それから '[[MyUtils sharedUtils] ...]' –

答えて

3

スーパークラスなしでMyUtilsと宣言しました。したがって、ランタイムは特定の基本的な動作(正当な理由で)を実装していないと不平を言います。おそらくNSObjectから継承することを意図:

@interface MyUtils : NSObject { 
} 

+ (NSString*) changeDateFormat_fromFormat:(NSString*)sourceFormat sourceDateString:(NSString*)sourceDateString destFormat:(NSString*)destFormat; 
+ (void) simpleAlert_ok:(NSString*)alertTitle message:(NSString*)alertMessage; 
@end 
+0

それはそれです...これはエラーの原因ではありましたが、私はしませんでした。すべてのクラスは少なくともNSObjectを継承する必要があります...それは私の頭の中に書かれています:-)しかし、誰かがなぜ私が関数を呼び出す前にデバッガを待つ場合、スーパークラスなしで正常に動作するか説明できますか? – Oliver

3

あなたはスーパーがあなたのMyUtilsクラスで宣言されていません。これを修正するには、@interface MyUtils@interface MyUtils : NSObjectに変更してください。スーパークラスを宣言していない場合は、必要なすべてのメソッドを自分で提供する必要があります。

+0

でも、関数を呼び出す前にデバッガを待つと、スーパークラスなしで正常に動作することがあるのはなぜですか? – Oliver

+1

それは面白いです。私はあなたが待っているとき、ランタイムは、直接、methodSignatureForSelector:とdoesNotRespondToSelector:を呼び出す代わりにクラスを調べますが、なぜそれがそれを行うのかはわかりません。 – ughoavgfhw

1

あなたのクラスは、コンパイル可能なオブジェクトタイプである必要があります。 iOSのObjective-Cの基本オブジェクトはNSObjectであり、すべてのクラスはそれを継承しています。 NSObject Class reference in the Apple Developer Libraryを参照して、NSObjectの上の詳細については

@interface MyUtils : NSObject { 


} 

    + (NSString *) ... ... ... 

:これまで

@interface MyUtils

あなたが言う行を変更したいです。

+0

okですが、関数を呼び出す前にデバッガを待つと、スーパークラスなしで正常に動作することがあります。 – Oliver

+0

あなたのプロジェクトを掃除して(Command + Shift + K)、それを再構築することをお勧めします。何が起こるか見る。 – Moshe

関連する問題