2011-01-02 4 views
1

Ich habe eine Klassenfunktion (deklariert und implementiert) in einer Klasse MyUtils. Wenn ich diese Funktion aufrufen, stürzt meine App ab. Im Debugger habe ich einen Haltepunkt bei der ersten Aktion der Funktion "theFunction". Und dieser Haltepunkt wird nie erreicht. HierObjective-C und Cocoa: Absturz beim Aufruf einer Klassenfunktion ohne Eingabe der Funktion

ist der Code:

// ================================================================================================= 
// 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** 

Die Konsole sagt:

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 

Wenn ich den Anruf ersetzen durch NSString *item = @"youyou"; dann alles in Ordnung ist.

Das Erzwingen einer Beibehaltung von aPreviousNSString vor dem Aufruf ändert nichts. Haben Sie eine Vorstellung davon, was passiert?

+1

Können wir mehr Code sehen? Ich vermute, dass 'MyUtils' ein Singleton ist. Ist das korrekt? – Moshe

+2

Dies scheint nicht Ihr tatsächlicher Code zu sein. Bei der Erstellung eines Scheinbeispiels haben Sie vielleicht wichtige Aspekte des abstürzenden echten Codes übersehen. Bitte zeigen Sie uns, was Sie tatsächlich verwenden. –

+0

@Moshe Nein, dann wäre es '[[MyUtils sharedUtils] ...]' –

Antwort

3

Sie haben MyUtils ohne eine Oberklasse deklariert, so beschwert sich die Laufzeit, dass es bestimmte Grundverhalten (zu Recht) nicht implementiert. Sie haben wahrscheinlich von NSObject erben gemeint:

@interface MyUtils : NSObject { 
} 

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

Das ist es ... Ich habe nicht gedacht, dass dies der Grund für den Fehler war. Jede Klasse muss zumindest NSObject erben ... Das steht in meinem Kopf :-) Aber ... Kann mir jemand erklären, warum ich, wenn ich auf den Debugger warte, bevor ich die Funktion aufruft, manchmal ohne die Superklasse funktioniert? – Oliver

3

Sie haben noch eine übergeordnete Klasse auf Ihrer MyUtils Klasse deklariert. Um es zu beheben, ändern Sie einfach @interface MyUtils zu @interface MyUtils : NSObject. Wenn Sie keine Superklasse deklarieren, müssen Sie alle erforderlichen Methoden selbst bereitstellen.

+0

ok, aber warum, wenn ich auf den Debugger vor dem Aufruf der Funktion warte, manchmal funktioniert es gut ohne die Oberklasse? – Oliver

+1

Das ist interessant. Ich würde schätzen, dass wenn Sie warten, die Laufzeit direkt durch die Klasse schaut, anstatt methodSignatureForSelector aufzurufen: und doesNotRespondToSelector :, aber ich habe keine Idee, warum es das tun würde. – ughoavgfhw

1

Ihre Klasse muss von einem Objekttyp sein, damit sie kompilierbar ist. Das Basisobjekt in Objective-C für iOS ist NSObject, alle Klassen erben von ihm.

Sie wollen die Linie zu ändern, das sagt:

@interface MyUtils

dazu:

@interface MyUtils : NSObject { 


} 

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

Weitere Informationen zu NSObject finden Sie in der NSObject Class reference in the Apple Developer Library.

+0

ok, aber warum, wenn ich auf den Debugger vor dem Aufruf der Funktion warten, manchmal funktioniert es gut ohne die Oberklasse? – Oliver

+0

Ich empfehle, das Projekt zu säubern (Befehl + Umschalt + K) und es dann neu zu erstellen. Schau was passiert. – Moshe

Verwandte Themen