Я пытаюсь получить 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];
});
, поскольку извлечение событий происходит синхронно, и это блокирует пользовательский интерфейс на это время, я использую 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
и, следовательно, запись уже была освобождена (что, после того, как выяснили причину проблемы, абсолютно логично).