Я, должно быть, делаю что-то не так, но документы по автоматическому подсчету ссылок не дают мне подсказки о том, что это может быть. То, что я делаю, вызывает метод с обратным вызовом блока из метода делегата. Доступ к тому же делегату из блока приводит к неправильному доступу . Проблема в том, что объект, который я передаю - loginController , который отправляет сообщение его делегату, - явно не освобождается, когда я не обращаюсь к нему внутри блока, я могу вызвать метод несколько раз без вопрос. Вот мой код:
- (void)loginViewDidSubmit:(MyLoginViewController *)loginController
{
NSString *user = loginController.usernameLabel.text;
NSString *pass = loginController.passwordLabel.text;
__block MyLoginViewController *theController = loginController;
[self loginUser:user withPassword:pass callback:^(NSString *errorMessage) {
DLog(@"error: %@", errorMessage);
DLog(@"View Controller: %@", theController); // omit this: all good
theController = nil;
}];
}
NSZombieEnabled ничего не записывает в журнал, и от gdb нет трассировки пригодного для использования стека. Что я здесь не так делаю? Спасибо за любые указатели!
Edit:
Я полагал, что проблема имеет большую область действия - обратный вызов выше вызывается из метода NSURLConnectionDelegate (сам блок является сильным свойством для этого делегата, поэтому ARC должен вызвать Block_copy ()). Нужно ли проводить специальные измерения в этом сценарии?
Поток (loginController остается видимым все время):
LoginController
[delegate loginViewDidSubmit:self];
Просмотр делегата
(method shown above calls the loginUser: method, which does something like:)
httpDelegate.currentCallback = callback;
httpDelegate.currentConnection = // linebreak for readability
[[NSURLConnection alloc] initWithRequest:req
delegate:httpDelegate
startImmediately:YES];
NSURLConnectionDelegate
- (void)connection:(NSURLConnection *)aConnection
didFailWithError:(NSError *)error
{
if (NULL != currentCallback) {
currentCallback([error localizedDescription]);
self.currentCallback = NULL;
}
}
И здесь я получаю неправильный доступ, но ТОЛЬКО если получаю доступ к этой переменной loginController ...