Objective-C和Cocoa:在不输入函数的情况下调用类函数时崩溃

时间:2011-01-02 23:46:59

标签: objective-c crash debugging function-call

我在类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";替换呼叫,那么一切正常。

在调用之前强制保留onPreviousNSString不会改变任何内容。 你知道发生了什么吗?

3 个答案:

答案 0 :(得分: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

答案 1 :(得分:3)

您的MyUtils类上没有声明超类。要解决此问题,只需将@interface MyUtils更改为@interface MyUtils : NSObject即可。如果您没有声明超类,则必须自己提供所有必需的方法。

答案 2 :(得分:1)

您的类需要具有某种对象类型才能进行编译。 Objective-C for iOS中的基础对象是NSObject,所有类都继承自它。

您想要更改以下行:

@interface MyUtils

到此:

@interface MyUtils : NSObject { 


}

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

有关NSObject的更多信息,请参阅NSObject Class reference in the Apple Developer Library