だから私は Java の世界から来たので、メモリ管理の問題を幸いなことに無知です。ほとんどの場合、ARC は私のお尻を救ってくれましたが、ここで私を困惑させたことがあります。基本的に、私はいくつかのものに NSInvocations を使用していますが、次のコード変更を行う前に、いくつかの厄介なメモリの問題に遭遇しました。これらの変更を行ってから、メモリ クラッシュはなくなりましたが、私は通常、理解できないコードを非常に恐れています。私はこれを正しく行っていますか?
前: あらゆる種類のメモリの問題:
NSInvocation *invocation = [NSInvocation invocationWithMethodSignature:[[target class] instanceMethodSignatureForSelector:selector]];
[invocation setSelector:selector];
[invocation setTarget:target];
[invocation setArgument:&data atIndex:2];
[invocation setArgument:&arg atIndex:3];
[invocation invoke];
NSString *returnValue;
[invocation getReturnValue:&returnValue];
後:メモリの問題はありませんが、これが正しいかどうかはわかりません:
NSInvocation *invocation = [NSInvocation invocationWithMethodSignature:[[target class] instanceMethodSignatureForSelector:selector]];
[invocation setSelector:selector];
[invocation setTarget:target];
[invocation setArgument:&data atIndex:2];
[invocation setArgument:&arg atIndex:3];
[invocation invoke];
CFTypeRef result;
[invocation getReturnValue:&result];
if (result)
CFRetain(result);
NSString *returnValue = (__bridge_transfer NSString *)result;
編集:
以下の回答に基づいて追加したかったので、objc_msgSendを使用しました。
NSString * returnValue = objc_msgSend(target, selector, data, arg);
また、すべてのメモリの問題が解決され、見た目がはるかにシンプルになります。これに問題がある場合はコメントしてください。