NSTimer崩溃了我的应用程序

时间:2011-05-11 11:08:53

标签: objective-c nstimer nsurl

所以我有一个使用NSTimer的应用程序。问题是当NSTimer运行时,我的应用程序将与EXC_BAD_ACCESS一起崩溃。我只是刚开始使用objective-c所以我不知道如何正确调试它。如果我认为使用-(void)logIn{}调用[self logIn];,该应用程序将起作用。 我的代码:
·H

@interface DJ_WAppDelegate : NSObject {
   NSTimer *loginTimer;
    }

    -(void)logIn;  

    @end

的.m

- (void)applicationDidFinishLaunching:(NSNotification *)aNotification {
    [self logIn];   // this works
    loginTimer = [NSTimer scheduledTimerWithTimeInterval:5.0 target:self selector:@selector(logIn) userInfo:nil repeats:YES];   // this fails
}

- (void)logIn {
    NSLog(@"Logging in...");

    // if I comment out these 2 lines it works with the NSTimer!?... (I've would have more code below)
    NSURL *loginConn = [NSURL URLWithString:[NSString stringWithFormat:@"some-website.com"]];   
    NSInteger loginReturn = [[NSString stringWithContentsOfURL:loginConn encoding:NSASCIIStringEncoding error:nil] intValue];

   // when "loginReturn" return "OK" the timer (loginTimer) will be stopped with: [loginTimer invalidate];

   // more code would be below... (which works!)
}


问题在于它所考虑的NSURL。  谢谢你的帮助。

编辑1: 这是崩溃堆栈:

    EException Type:  EXC_BAD_ACCESS (SIGBUS)
Exception Codes: KERN_PROTECTION_FAILURE at 0x0000000000000020
Crashed Thread:  0  Dispatch queue: com.apple.main-thread

Application Specific Information:
objc_msgSend() selector name: respondsToSelector:


Thread 0 Crashed:  Dispatch queue: com.apple.main-thread
0   libobjc.A.dylib                 0x9603bed7 objc_msgSend + 23
1   com.apple.CoreFoundation        0x922ed5f2 _CFStringAppendFormatAndArgumentsAux + 3138
2   com.apple.CoreFoundation        0x922ec979 _CFStringCreateWithFormatAndArgumentsAux + 105
3   com.apple.Foundation            0x9656ebfb -[NSPlaceholderString initWithFormat:locale:arguments:] + 163
4   com.apple.Foundation            0x9656eaae +[NSString stringWithFormat:] + 88
5   com.who.DJ-W                0x00001d56 -[DJ_WAppDelegate logIn] + 116 (DJ_WAppDelegate.m:108)
6   com.apple.Foundation            0x965b08d4 __NSFireTimer + 141
7   com.apple.CoreFoundation        0x922ffadb __CFRunLoopRun + 8059
8   com.apple.CoreFoundation        0x922fd464 CFRunLoopRunSpecific + 452
9   com.apple.CoreFoundation        0x922fd291 CFRunLoopRunInMode + 97
10  com.apple.HIToolbox             0x91646e04 RunCurrentEventLoopInMode + 392
11  com.apple.HIToolbox             0x91646bb9 ReceiveNextEventCommon + 354
12  com.apple.HIToolbox             0x91646a3e BlockUntilNextEventMatchingListInMode + 81
13  com.apple.AppKit                0x9265378d _DPSNextEvent + 847
14  com.apple.AppKit                0x92652fce -[NSApplication nextEventMatchingMask:untilDate:inMode:dequeue:] + 156
15  com.apple.AppKit                0x92615247 -[NSApplication run] + 821
16  com.apple.AppKit                0x9260d2d9 NSApplicationMain + 574
17  com.who.DJ-W                0x00001c92 start + 54

希望这有助于...找到错误

编辑2:
随着僵尸模式开启,我得到了这个:*** -[CFString respondsToSelector:]: message sent to deallocated instance 0x46d550我希望这会有所帮助。

编辑3:
Ball:这是原始网址(此处删除了网址)/DJW/work.php?user=iBlackbirdi&udid=00000000-0000-1000-80005&key=660e5744e&cmd=slocau&type=get

2 个答案:

答案 0 :(得分:3)

这里有几个问题:

  1. djwLog是一个类方法,所以你应该在类而不是实例上调用它 像这样:[[self class] djwLog:@"foo bar"]

  2. URLFromString:方法需要字符串包含RFC 1808指定的有效网址。类似[NSURL URLFromString:@"http://example.com/foo"]

  3. 的内容
  4. stringWithContentsOfURL:url…是一种同步方法。除非您在单独的线程中运行此代码,否则不应使用此代码。查看NSURLConnection以获取从URL异步加载数据的类。使用同步调用是一个的想法。总是

  5. intValue返回signed integer。要NSInteger使用integerValue。此外,如果您使用stringWithContentsOfURL,请务必在致电前检查结果是否为nil integerValue否则,如果URL调用失败或未返回数据,您可能会得到0的结果。在任何情况下,您调用的API的真正解析器都是个好主意。

答案 1 :(得分:2)

您正在调用类方法,就好像它是一个实例方法:

[self djwLog:@"Logging in..."];

由于没有名为djwLog的实例方法,应用程序崩溃了。您应该直接调用NSLog,使其成为实例方法 - 或者最好为日志创建一个宏:

#ifdef DEBUG
#   define DLog(...) NSLog(@"%s %@", __PRETTY_FUNCTION__, [NSString stringWithFormat:__VA_ARGS__])
#else
#   define DLog(...) do { } while (0)
#endif

如果你代替NSLog写DLog - 它只会在定义了DEBUG-flag时记录。除此之外,它还将记录日志消息的来源 - 这样您就可以看到日志条目来自哪个类/方法。