- [CFString hash]: сообщение отправлено на освобожденный экземпляр - PullRequest
1 голос
/ 01 ноября 2011

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

...