我来自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);
它解决了所有内存问题,并且看起来更简单。如果您发现任何问题,请进行评论。