Цель-C: В чем разница между идентификатором и идентификатором непрозрачного указателя? - PullRequest
0 голосов
/ 09 декабря 2011

Для переменной id я могу назначить блок и затем вызвать его; с непрозрачным идентификатором указателя это не работает (EXC_BAD_ACCESS).

В RestKit объект userData является «непрозрачным указателем»; Теперь я хотел бы назначить ему переменную блока для вызова этого блока после завершения запроса. Но из-за этого EXC_BAD_ACCESS это не работает. Есть ли возможность использовать этот непрозрачный указатель для назначения ему блока?

Большое спасибо!

EDIT

// this works
id testId = ^{
   NSLog(@"hello");
};

testId();

// this doesn't - but it's important to know RestKit
void (^postNotification)(void) = objectLoader.userData // EXC_BAD_ACCESS
postNotification();

objectLoader имеет тип RKObjectLoader (подкласс RKRequest), и API говорит о userData: An opaque pointer to associate user defined data with the request.

1 Ответ

2 голосов
/ 09 декабря 2011

Вы должны показать нам, как вы создаете блок и назначаете его для userData, чтобы быть уверенным, но я предполагаю, что вы не копируете блок, и он выходит из области видимости, например:*

Блоки создаются в стеке.Это означает, что когда составной оператор (например, функция), содержащий его, заканчивается, блок больше не действителен.Если вы хотите, чтобы блок выжил, вам нужно скопировать его в кучу:

objectLoader.userData = [^{ ... } copy];
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...