我有一个框架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
框架示例代码(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的问题。 我通过返回基本数据类型解决了这个问题。
答案 0 :(得分:1)
这与ARC和非ARC代码之间的内存管理无关。相反,这是因为NSInvocation不能与ARC非常干净地工作。无论如何,通常最好避免使用NSInvocation,而使用ARC则更是如此。对于你使用NSInvocation的任何东西,通常都有更好的选择。如果必须使用NSInvocation,则需要记住它只处理原始字节blob并且根本不处理对象所有权,因此传递ARC管理的指针不是犹太教。您希望将返回值变量设置为void指针,然后使用桥接转换将其分配给普通的对象类型变量。