Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c -[CFString hash]:发送到解除分配实例的消息_Objective C_Cocoa Touch_Eventkit_Cfstring_Ekevent - Fatal编程技术网

Objective c -[CFString hash]:发送到解除分配实例的消息

Objective c -[CFString hash]:发送到解除分配实例的消息,objective-c,cocoa-touch,eventkit,cfstring,ekevent,Objective C,Cocoa Touch,Eventkit,Cfstring,Ekevent,我试图从事件存储中获取EKEvents,以填充UITableView并显示月份列表视图 基本上是这样的,我是这样做的: - (void) reloadEvents { for ( NSString *entry in self.calendarA ) { NSMutableArray *tempArray = [[[NSMutableArray alloc] init] autorelease]; [tempArray addObjectsFro

我试图从事件存储中获取
EKEvent
s,以填充
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];
                   });
}
这样,应用程序就不会崩溃了。
似乎有什么东西改变了
Calendar a
,因此条目已被取消分配(在找到问题原因后,这是绝对合乎逻辑的)。

我看不到您发布的代码有任何问题。我看到您已将环境变量NSZombieEnabled设置为YES,请检查此SO问题,查找chown用户的答案并尝试调试。如果可能的话,你可以用这段代码创建一个小项目(崩溃)并发布到这里。是否有可能在另一个线程中运行的东西正在改变日历?这会打乱枚举。这里没有足够的代码进行诊断。我想@Flyingdiver是对的。在此期间,我的数组确实发生了一些变化,这将枚举搞砸了。在稍微更改代码后,它现在可以正常工作了。非常感谢你!!!如果你能写下那条评论作为回答,然后接受它,那将是很有帮助的。