Попытка создать USE_BLOCK_IN_FRAME ... EXC_BAD_ACCESS с NSFetchedResultsController - PullRequest
7 голосов
/ 07 мая 2011

Это обновление к моей проблеме. Я получаю это предупреждение сейчас, когда программа прерывается. предупреждение: попытка создать переменную USE_BLOCK_IN_FRAME с блоком, который не находится в кадре.

Я не могу найти много информации о том, что это значит.


Это меня озадачило. Я получаю ошибку EXC_BAD_ACCESS. У меня есть NSZombieEneabled (который помог с более ранней проблемой), но нет стека вызовов для отслеживания.

У меня есть почти идентичный код, который работает по отношению к другому извлеченному контроллеру результатов.

Кажется, это как-то связано с отношениями между объектом задания и связанным с ним объектом клиента. Это отношение [объект задания] << -> [объект клиента].

Изначально я вижу, что код работает без ошибок, когда объект задания, соответствующий выбранной строке, не имеет объекта клиента, связанного через отношение. Таким образом, в случае сбоя это указывает на клиентскую сущность, но если это не так, указатель равен нулю.

Когда я сталкиваюсь с этой проблемой, я запускаю приложение и перехожу непосредственно к представлению выбора работы и выбираю ячейку. Именно в этот момент возникает проблема.

Я провел эксперимент, запустив приложение и сначала перейдя к представлению выбора клиента, зная, что выборка будет происходить из всех клиентских объектов. Затем я пошел к представлению выбора работы и выбрал ячейку. Проблема не возникла.

Поскольку я просто пытаюсь передать указатель на объект задания, который уже был получен, я не понимаю, что происходит.

Кстати, код работал нормально, прежде чем я переключился на использование NSFetchedResultsControllers. Мне нравится то, что они могут сделать для меня, но здесь происходит некоторая динамика, которую я не понял.

Регистрация не показывает мне ничего, что я понимаю, в отношении решения проблемы.

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    userState.selectedJob = [self.fetchedResultsController objectAtIndexPath:indexPath];
    NSLog(@"\n\n(1 Pick) indexPath: %@\n",indexPath);
    NSLog(@"\n\n(1 Pick) userState: %@\n",userState);    
    NSLog(@"\n\nnumber of Objects in job fetchresultscontroller = %d", [[fetchedResultsController fetchedObjects] count] );    
    NSLog(@"\n\n(1 Pick) selected job: %@\n",[self.fetchedResultsController objectAtIndexPath:indexPath]); // This line is causing the problem...
    NSLog(@"\n\n(1 Pick) selected job: %@\n",userState.selectedJob); // Omitting the line above, this line fails 
    [self.navigationController pushViewController:userState.jobInfoTVC animated:YES];     
}

Вывод отладки:

2011-05-07 09:27:04.142 job1[6069:207] 

(1 Pick) indexPath: <NSIndexPath 0x5952590> 2 indexes [0, 3]
2011-05-07 09:27:04.142 job1[6069:207] 

(1 Pick) userState: <UserStateObject: 0x5919970>
2011-05-07 09:27:04.143 job1[6069:207] 

number of Objects in job fetchresultscontroller = 4
(gdb) 

Окончательный код должен быть таким простым, что привело меня ко всем журналам:

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    userState.selectedJob = [self.fetchedResultsController objectAtIndexPath:indexPath]; // Original failure was at this line
    [self.navigationController pushViewController:userState.jobInfoTVC animated:YES];     
}

Я использую singleton userState, чтобы отслеживать, что сделал пользователь. Так что я сохраняю там указатели на объекты selectedJob и selectedClient. Это работало хорошо, прежде чем я переключился на NSFetchedResultsController.

Ответы [ 2 ]

1 голос
/ 24 ноября 2011

У меня также была проблема с Попытка создать переменную USE_BLOCK_IN_FRAME с блоком, которого нет в кадре .Хотя мое не имело ничего общего с NSFetchedResultsControllers.

Возможно, ваша проблема

Я заметил, что вы упоминаете, что используете синглтон, поэтому, возможно, ваша проблема решена по этой ссылке:

http://npenkov.com/2011/08/01/solving-issues-like-warning-attempting-to-create-use_block_in_frame-variable-with-block-that-isnt-in-the-frame/

По ссылке:

Именно в менеджере сессий я использовал макрос до @synthesize - это было проблемой, статические определения не должны появляться перед синтезированными методами,Так что если у вас есть что-то вроде:

SYNTHESIZE_SINGLETON_FOR_CLASS(SessionManager)
@synthesize loggedUserId, ...

Просто замените его на:

@synthesize loggedUserId, ...
SYNTHESIZE_SINGLETON_FOR_CLASS(SessionManager)

enter code here

Моя проблема

Проблема IОн был связан с дублированием объявления переменной, в этом случае переменная, унаследованная от NSManagedObject:

- (void)functionThatDoesSomething {

    VariableInheritedFromNSMObj *variableA = nil;

    for (VariableInheritedFromNSMObj *variableA in [self containerObject]) {
         NSLog(@"a = %@\n", [variableA name]);
    }

    [variableA setName:@"StackOverflow"];

}

Перемещает первую строку, где переменная A инициализируется в ноль, в после того, как цикл устраняет проблему.В своем производственном коде я затем изменил имя одной из переменных.

Надеюсь, это поможет вам или кому-то еще, кто сталкивается с этой проблемой.Эта ошибка, похоже, проявляется по-разному.

0 голосов
/ 16 ноября 2011

Установлена ​​ли версия целевой системы развертывания ниже, чем у вас есть поддержка отладки в Xcode 4.2?Когда это случилось со мной, цель развертывания как-то изменилась на 4.1, но у меня был только симулятор 4.3 без дополнительной поддержки отладки для 4.0-4.1.

Есть способы исправить это:

  1. Установите символы отладки для вашей более низкой версии ОС из настроек XCode.Перейдите к загрузкам, компонентам и установите OS 4.0 - 4.1 Поддержка отладки устройства (или более раннюю, если вам это нужно).
  2. Установите цель развертывания 4.3 или выше.

Если вы выберетеВ первом случае, возможно, стоит поставить галочку в настройках для автоматической загрузки обновлений.

...