私は何か間違ったことをしているに違いありませんが、自動参照カウントのドキュメントはそれが何であるかについてのヒントを私に与えません。私がやっていることは、デリゲートメソッド内からブロックコールバックを使用してメソッドを呼び出すことです。ブロック内から同じデリゲートにアクセスすると、アクセスが悪くなります。問題は、渡したオブジェクト(デリゲートにメッセージを送信している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からの使用可能なスタックトレースはありません。私はここで何が間違っているのですか?ポインタをありがとう!
編集:
問題の範囲が広いと思いました。上記のコールバックは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変数にアクセスする場合に限ります...