我有一个框架 A,它是 ARC。这会消耗一些来自非 ARC 框架 B 的 API。
框架B示例代码(非ARC):
@interface Settings : NSObject {
NSDictionary* settings;
}
- (NSString*)stringForKey:(NSString*)key;
@end
@implementation Settings
- (NSString*)stringForKey:(NSString*)key {
return [settings objectForKey: key];
}
@end
框架A示例代码(ARC):
{
// ...
SEL stringForKeySelector = @selector(stringForKey:);
NSMethodSignature *stringForKeySignature = [[Settings class] instanceMethodSignatureForSelector:stringForKeySelector];
NSInvocation *stringForKeyInvocation = [NSInvocation invocationWithMethodSignature:stringForKeySignature];
[stringForKeyInvocation setSelector:stringForKeySelector];
[stringForKeyInvocation setTarget:SettingsObject];
NSString *Key = @"KEY";
[stringForKeyInvocation setArgument:& Key atIndex:2];
[stringForKeyInvocation invoke];
NSString *value = nil;
[stringForKeyInvocation getReturnValue:& value];
// ...
}
在框架 A 中执行上述代码后,设置字典中的对象被释放。
提前感谢任何帮助。
回答: 感谢 Chuck 指出 NSInvocation 和 ARC 的问题。 我通过返回基本数据类型解决了这个问题。
最佳答案
这与 ARC 和非 ARC 代码之间的内存管理无关。相反,这是因为 NSInvocation 不能非常干净地与 ARC 一起工作。无论如何,通常最好避免使用 NSInvocation,使用 ARC 时更是如此。对于您要使用 NSInvocation 的任何事情,通常都有更好的选择。如果你必须使用 NSInvocation,你需要记住它只处理原始字节 blob 而根本不处理对象所有权,所以传递一个 ARC 管理的指针是不合理的。您需要将返回值变量设为空指针,然后使用桥接转换将其分配给普通对象类型变量。
关于ios - ARC 和非 ARC 框架之间的内存管理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24616629/