Ios 保存80个事件后接收内存警告 -(无效)与日历同步 { NSMutableDictionary*dictionary=[util readPListData]; NSMutableArray*课程=[util getCourses]; __块NSMutableArray*课程; __块NSMutableDictionary*课程; NSString*studentID=[util getProgramDetails].studentID; NSString*programName=[util getProgramDetails].programName; __块NSString*startDateString=@“,*endDateString=@”; NSDateFormatter*格式化程序; 格式化程序=[[NSDateFormatter alloc]init]; [格式化程序setDateFormat:@“MM/dd/yyyy HH:MM:ss”]; [格式化程序setDateFormat:@“MM/dd/yyyy”]; NSString*currentDateString=[NSString stringWithFormat:@“%@09:00:00”,[formatter stringFromDate:[NSDate date]]; [格式化程序setDateFormat:@“MM/dd/yyyy HH:MM:ss”]; NSDate*currentDate=[formatter dateFromString:currentDateString]; self.eventstore=[[EKEventStore alloc]init]; [self.eventstore requestAccessToEntityType:eEntityTypeEvent completion:^(BOOL已授予,NSError*错误) { 如获批准{ NSLog(@“已授予日历访问权”); 对于(int i=0;i

Ios 保存80个事件后接收内存警告 -(无效)与日历同步 { NSMutableDictionary*dictionary=[util readPListData]; NSMutableArray*课程=[util getCourses]; __块NSMutableArray*课程; __块NSMutableDictionary*课程; NSString*studentID=[util getProgramDetails].studentID; NSString*programName=[util getProgramDetails].programName; __块NSString*startDateString=@“,*endDateString=@”; NSDateFormatter*格式化程序; 格式化程序=[[NSDateFormatter alloc]init]; [格式化程序setDateFormat:@“MM/dd/yyyy HH:MM:ss”]; [格式化程序setDateFormat:@“MM/dd/yyyy”]; NSString*currentDateString=[NSString stringWithFormat:@“%@09:00:00”,[formatter stringFromDate:[NSDate date]]; [格式化程序setDateFormat:@“MM/dd/yyyy HH:MM:ss”]; NSDate*currentDate=[formatter dateFromString:currentDateString]; self.eventstore=[[EKEventStore alloc]init]; [self.eventstore requestAccessToEntityType:eEntityTypeEvent completion:^(BOOL已授予,NSError*错误) { 如获批准{ NSLog(@“已授予日历访问权”); 对于(int i=0;i,ios,objective-c,ekevent,ekeventstore,Ios,Objective C,Ekevent,Ekeventstore,切换到ARC可以解决内存问题,但大量数据仍可能出现问题。 尝试在for循环内部使用@autorelease池,如示例所示 - (void)syncWithCalendar { NSMutableDictionary *dictionary = [util readPListData]; NSMutableArray *courses = [util getCourses]; __block NSMutableArray *lessons; __bl

切换到ARC可以解决内存问题,但大量数据仍可能出现问题。 尝试在for循环内部使用@autorelease池,如示例所示

- (void)syncWithCalendar
{

    NSMutableDictionary *dictionary = [util readPListData];  
    NSMutableArray *courses = [util getCourses];  
    __block NSMutableArray *lessons;   
    __block NSMutableDictionary *lesson;    
    NSString *studentID = [util getProgramDetails].studentId;  
    NSString *programName = [util getProgramDetails].programName;

    __block NSString *startDateString = @"", *endDateString = @"";

    NSDateFormatter *formatter;  
    formatter = [[NSDateFormatter alloc] init];  
    [formatter setDateFormat:@"MM/dd/yyyy HH:mm:ss"];  
    [formatter setDateFormat:@"MM/dd/yyyy"];  

    NSString *currentDateString = [NSString stringWithFormat:@"%@ 09:00:00", [formatter stringFromDate:[NSDate date]]];  
    [formatter setDateFormat:@"MM/dd/yyyy HH:mm:ss"];

    NSDate *currentDate = [formatter dateFromString:currentDateString];

    self.eventstore = [[EKEventStore alloc] init];

   [self.eventstore requestAccessToEntityType:EKEntityTypeEvent completion:^(BOOL granted, NSError *error)  
    {  
        if (granted) {  

            NSLog(@"calendar access granted");

            for (int i=0; i<[courses count]; i++)
            {
                lessons = [[courses objectAtIndex:i] objectForKey:@"lessons"];
                for (int j=0; j<[lessons count]; j++)
                {
                    lesson = [lessons objectAtIndex:j];
                    NSString *title = nil;
                    title = [NSString stringWithFormat:@"%@ %@-Complete %@ lesson",studentID,programName,[lesson objectForKey:@"lesson-name"]];

                    startDateString = [NSString stringWithFormat:@"%@ %@", [lesson objectForKey:@"exam-date"], @"09:00:00"];
                        endDateString = [NSString stringWithFormat:@"%@ %@", [lesson objectForKey:@"exam-date"], @"18:00:00"];

                    if (!([startDateString isEqualToString:@""] && [endDateString isEqualToString:@""]))
                    {
                        EKEvent *event = [EKEvent eventWithEventStore:self.eventstore];
                        event.title=title;
                        event.startDate = [formatter dateFromString:startDateString];
                        event.endDate = [formatter dateFromString:endDateString];

                        event.allDay = NO;

                        [event setCalendar:[self.eventstore defaultCalendarForNewEvents]];


                       NSError *err = nil;
             [self.eventstore saveEvent:event span:EKSpanThisEvent commit:YES error:&err];
           //[self.eventstore saveEvent:event span:EKSpanThisEvent error:&err];
                            if (err) {
                                NSLog(@"event not saved .. error = %@",err);
                            } else {
                                NSLog(@"event added successfully");
                            }       
                    }
                } // lessons for loop
            } // courses for loop

        } else {
            NSLog(@"Access not granted");
        }
    }];

    [self.eventstore release];  
    [formatter release];
}

for(int i=0;i最终我找到了问题的答案。我想与大家分享我的解决方案,这样它可以帮助其他人

我在iOS 7中特别遇到了崩溃,这是因为下面的一行

//错误
[self.eventstore saveEvent:event span:EKSpanThisEvent提交:是错误:&err]

保存事件的正确方法:(注意:我的案例不需要事件标识符)
//正确的
[self.eventstore saveEvent:event span:EKSpanThisEvent提交:无错误:&err]; 然后使用 [self.eventstore提交:NULL]

保存所有事件后。
在我的例子中,这停止了崩溃。

@upendar我也有相同的场景,但我被分成了小部分,例如,如果要同步80个事件,则需要20-20秒,并在它们之间暂停2-5秒。
autoreleasepool
使用起来很好,但它占用了太多内存来执行。这将需要超过100%的时间


我对这个问题进行了说明。非常有趣的一个!!!

你为什么不使用ARC?你在代码中的什么地方创建了一些东西而没有发布它?你使用了工具吗?我想我正在发布代码中的所有内容。让我试着将代码切换到ARC。我也在ARC中进行了尝试,但它仍然显示相同的问题…你使用了工具来解决问题ee它创建了什么,什么时候,但没有被破坏?是的,我正在尝试,但我对仪器是新手,所以不知道如何检测内存泄漏发生的代码行…我可以看到仪器中显示内存不足警告的标志,但我无法理解代码中的问题到底在哪里…我尝试了自动释放池,但我仍然不知道获取“因SpringBoard终止而终止”问题你在iOS 6上试过吗?看看本教程,其中解释了如何使用仪器。这样你可以尝试调试可能的泄漏。代码在iOS 6中运行良好。在iOS 7中崩溃。我该怎么办?你是否使用仪器来查找内存泄漏发生的位置?很明显,你需要在测试之前释放未使用的内存您需要找到问题所在。我尝试了saveEvent:span:error:并假设它没有进行提交。我错了。您必须使用您所说的提交:无标志
for (int i=0; i<[courses count]; i++)
            {
@autoreleasepool {
                lessons = [[courses objectAtIndex:i] objectForKey:@"lessons"];
                for (int j=0; j<[lessons count]; j++)
                {
                    lesson = [lessons objectAtIndex:j];
                    NSString *title = nil;
                    title = [NSString stringWithFormat:@"%@ %@-Complete %@ lesson",studentID,programName,[lesson objectForKey:@"lesson-name"]];

                    startDateString = [NSString stringWithFormat:@"%@ %@", [lesson objectForKey:@"exam-date"], @"09:00:00"];
                        endDateString = [NSString stringWithFormat:@"%@ %@", [lesson objectForKey:@"exam-date"], @"18:00:00"];

                    if (!([startDateString isEqualToString:@""] && [endDateString isEqualToString:@""]))
                    {
                        EKEvent *event = [EKEvent eventWithEventStore:self.eventstore];
                        event.title=title;
                        event.startDate = [formatter dateFromString:startDateString];
                        event.endDate = [formatter dateFromString:endDateString];

                        event.allDay = NO;

                        [event setCalendar:[self.eventstore defaultCalendarForNewEvents]];


                       NSError *err = nil;
             [self.eventstore saveEvent:event span:EKSpanThisEvent commit:YES error:&err];
           //[self.eventstore saveEvent:event span:EKSpanThisEvent error:&err];
                            if (err) {
                                NSLog(@"event not saved .. error = %@",err);
                            } else {
                                NSLog(@"event added successfully");
                            }       
                    }
                } // lessons for loop
}//autoreleasepool
            } // courses for loop