【问题标题】:App crash in IBAction methodIBAction 方法中的应用程序崩溃
【发布时间】:2011-02-26 16:16:33
【问题描述】:

好的,这是我的代码

-(IBAction)nextAction
{
    dispatch_async(myQueue, ^{ [self plusOneDate]; });
}

-(void)plusOneDate
{
    int hoursToAdd = 1;  

    // set up date components
    NSDateComponents *components = [[[NSDateComponents alloc] init] autorelease];
    [components setHour:hoursToAdd];

    // create a calendar
    NSCalendar *gregorian = [[[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar] autorelease];
    NSDate *newDate2 = [gregorian dateByAddingComponents:components toDate:appStateDate options:0];

    NSDateFormatter *formatter = [[NSDateFormatter alloc]init];
    [formatter setDateFormat:@"YYYYMMddHH0000"];
    dateString = [formatter stringFromDate:newDate2];
    [formatter release];

    appStateDate = newDate2;
    newDate2 = nil;
}

它所做的只是将 1 小时添加到 NSDate 对象 (appStateDate)、格式化它并设置 dateString 变量。

每次我按下应用程序中的 UIButton,连接到nextAction,应用程序就会崩溃。 我尝试删除 xib 文件并创建一个新文件。它没有帮助,仍然崩溃。

在调试模式下:

*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '(null): unrecognized selector sent to class 0x6242690'

有人知道为什么吗?我越来越沮丧了。

【问题讨论】:

  • 为什么不使用调试器来准确找出应用程序崩溃的步骤?
  • 我不熟悉这种语法^{ [self plusOneDate]; }。你确定没问题吗?
  • 这是 Objective-C 2.0 的块语法。想想匿名闭包。它在 Apple 的 GCC 以及 clang 编译器(适用于所有人)中都可用。
  • @Noam -- 这是一个障碍。他们是新的。这是正确的语法。
  • 在调试器中,您可以根据其地址找出哪个对象崩溃,在本例中为 0x6242690。在调试器控制台中,输入po 0x6242690,它将打印对象的描述。

标签: iphone objective-c xcode


【解决方案1】:

这与其说是一个答案,不如说是一个观察。在方法末尾分配给 appStateDate 的值是一个自动释放的对象,您在任何地方都没有保留它。您不能依赖属性的“保留”属性(如果 appStateDate 实际上在某处声明为属性),因为您没有在分配中使用该属性。

一旦 IBAction 完成,appStateDate 指向的对象将在 runloop 耗尽 NSAutoreleasePool 时被回收。也许这就是崩溃的来源。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-14
    相关资源
    最近更新 更多