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