1

MyUtilsクラスに(宣言および実装された)クラス関数があります。この関数を呼び出すと、アプリがクラッシュします。デバッガーでは、「theFunction」関数の最初のアクションにブレークポイントがあります。そして、このブレークポイントに到達することはありません。

コードは次のとおりです。

// =================================================================================================
// 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";すべて問題ありません。

呼び出しの前にaPreviousNSStringを強制的に保持しても、何も変更されません。あなたは何が起こっているのかについての考えを持っていますか?

4

3 に答える 3

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
于 2011-01-03T00:17:06.223 に答える
3

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

于 2011-01-03T00:17:31.917 に答える
1

クラスをコンパイル可能にするには、クラスが何らかのオブジェクト型である必要があります。Objective-C for iOS の基本オブジェクトは NSObject であり、すべてのクラスがそれを継承しています。

次の行を変更します。

@interface MyUtils

これに:

@interface MyUtils : NSObject { 


}

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

NSObject の詳細については、Apple Developer Library の NSObject クラス リファレンスを参照してください。

于 2011-01-03T00:24:29.837 に答える