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是对的。在此期间,我的数组确实发生了一些变化,这将枚举搞砸了。在稍微更改代码后,它现在可以正常工作了。非常感谢你!!!如果你能写下那条评论作为回答,然后接受它,那将是很有帮助的。