- [CFString hash]:发送给deallocated实例的消息

时间:2011-11-01 18:01:36

标签: objective-c cocoa-touch eventkit cfstring ekevent

我正在尝试从事件存储中提取EKEvent以填充UITableView并显示月份列表视图。

基本上它可以工作,我这样做:

- (void) reloadEvents
{
    for ( NSString *entry in self.calendarA )
    {
        NSMutableArray *tempArray = [[[NSMutableArray alloc] init] autorelease];

        [tempArray addObjectsFromArray:[appDelegate.eventStore eventsMatchingPredicate:[appDelegate.eventStore predicateForEventsWithStartDate:[NSDate fromString:entry] endDate:[[NSDate fromString:entry] midnight] calendars:nil]]];    
        [tempArray addObjectsFromArray:[self initializeItems:[NSDate fromString:entry] withEndDate:[[NSDate fromString:entry] midnight]]];        
        [tempArray sortUsingDescriptors:[NSArray arrayWithObject:[[[NSSortDescriptor alloc] initWithKey:@"startDate" ascending:YES] autorelease]]];

        [[self.calendarD objectForKey:entry] addObjectsFromArray:tempArray];
    }
    dispatch_async(dispatch_get_main_queue(), ^(void)
                   {
                       [self redrawTableCells];
                   });
}

中调用

reloadEvents

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^(void)
{
    [self reloadEvents];
});

因为获取事件同步发生并且它锁定了那段时间的UI,我正在使用GCD。 NSDate部分是NSDate上我自己的类别。

现在,当我的视图控制器加载时,将从事件存储中提取事件并正确显示。视图控制器还会侦听EKEventStoreChangedNotification,这就是我的应用程序崩溃的地方。当我在应用程序之外更改事件时,它会收到通知并尝试重新加载事件数据,但随后......

  

*** -[CFString length]:消息发送到解除分配的实例0x666f530

修改 我已将reloadEvents更改为以下内容:

- (void) reloadEvents
{
    NSArray *daysArray = [[self.calendarD allKeys] sortedArrayUsingSelector:@selector(compare:)];

    for ( NSString *entry in daysArray )
    {
        NSMutableArray *tempArray = [[NSMutableArray alloc] init];

        [tempArray addObjectsFromArray:[appDelegate.eventStore eventsMatchingPredicate:[appDelegate.eventStore predicateForEventsWithStartDate:[NSDate fromString:entry] endDate:[[NSDate fromString:entry] midnight] calendars:nil]]];    
        [tempArray addObjectsFromArray:[self initializeItems:[NSDate fromString:entry] withEndDate:[[NSDate fromString:entry] midnight]]];        
        [tempArray sortUsingDescriptors:[NSArray arrayWithObject:[[[NSSortDescriptor alloc] initWithKey:@"startDate" ascending:YES] autorelease]]];

        [[self.calendarD objectForKey:entry] addObjectsFromArray:tempArray];
        [tempArray release];
    }
    dispatch_async(dispatch_get_main_queue(), ^(void)
                   {
                       [self redrawTableCells];
                   });
}

通过这个,应用程序不再崩溃。 似乎更改了calendarA,因此该条目已经解除分配(在找到问题的原因之后,这绝对是合乎逻辑的)。

0 个答案:

没有答案