【问题标题】:iPhone - Program Received Signal : 0 - on device but not on simulatoriPhone - 程序接收信号:0 - 在设备上但不在模拟器上
【发布时间】:2011-01-05 21:09:34
【问题描述】:

我确定这与内存有关,但我似乎无法弄清楚是什么变量导致了我的问题。

据我所知,我将释放我分配的所有内容。如果这个循环运行 365 次而不是 730 次(一年中的天数),它似乎可以正常工作。

这是失败的代码的 sn-p。当程序在设备上结束时,它永远不会脱离循环。

非常感谢任何帮助。谢谢!

NSMutableArray *dtArray = [[NSMutableArray alloc] init];

    double frequencyInterval = [Frequency doubleValue];
    int i;

    NSString *newDateString = @"";
    NSString *sqlString = [NSString stringWithFormat:@"insert into ToDoList (TaskId, DueDate, Completed, Notes, Status, CompletedDate, Frequency) values ('%i', \"%@\", '0',\"%@\",'' ,'0', %@);", (int)self.AddTaskId, origDueDateString, NotesField, todoFrequency];
    NSDate *nDate = dueDate;
    NSDateFormatter *f3 = [[NSDateFormatter alloc] init];
    [f3 setDateFormat:@"yyyy-MM-dd"];

    for(i=0; i< 1000; i++) {

         newDate = [newDate addTimeInterval:(frequencyInterval*86400)];
        newDateString = [f3 stringFromDate:newDate];

        if ([endRecurDate compare:newDate] == NSOrderedDescending)
        {
            [dtArray addObject:newDate];
            if (i == 0)
            {
                sql = [sqlString stringByAppendingString:[NSString stringWithFormat:@"insert into ToDoList (TaskId, DueDate, Completed, Notes, Status, CompletedDate, Frequency) values ('%i', \"%@\", '0',\"%@\",'' ,'0', %@)", (int)self.AddTaskId, newDateString, NotesField, todoFrequency]];
            }
            else
            {
                sql = [sql stringByAppendingString:[NSString stringWithFormat:@";insert into ToDoList (TaskId, DueDate, Completed, Notes, Status, CompletedDate, Frequency) values ('%i', \"%@\", '0',\"%@\",'' ,'0', %@)", (int)self.AddTaskId, newDateString, NotesField, todoFrequency]];
            }
            //stringByAppendingString

        }
        else
        {
            break;
        }

    }
    [dtArray release];
    [f3 release];

【问题讨论】:

    标签: iphone cocoa-touch xcode memory-management


    【解决方案1】:

    一方面,您不需要将newDateString 初始化为@"";只需声明它就足够了。

    我没有注意到任何明显的内存泄漏,但是您循环了 for 语句 1,000 次。在整个循环完成之前,可能不会释放所有自动释放的对象,因此这可能就是您使用过多内存的原因。要在循环期间释放它们,请执行以下操作:

    for(i=0; i< 1000; i++) {
        NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
    
        /* your code here */
    
        [pool drain];
    }
    

    稍微玩一下;您可能不需要每次循环执行一次都排空池,但您可以构建一个计数器并每隔 25 个循环左右排空一次池。

    【讨论】:

    • 也许我没有正确处理这个问题,但我没有在这个循环中自动释放任何对象。
    • 您不是,但您调用的许多方法都返回自动释放的对象。每次调用 stringByAppendingString、stringFromDate 等时,返回的对象都会自动释放。据我统计,循环中有六个对象,根据字符串的长度,这几乎肯定是问题所在。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-08
    • 2011-02-07
    • 2013-07-08
    • 2014-05-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多