ARC和非ARC框架之间的内存管理

时间:2014-07-07 17:46:05

标签: ios objective-c memory-management automatic-ref-counting

我有一个框架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的问题。 我通过返回基本数据类型解决了这个问题。

1 个答案:

答案 0 :(得分:1)

这与ARC和非ARC代码之间的内存管理无关。相反,这是因为NSInvocation不能与ARC非常干净地工作。无论如何,通常最好避免使用NSInvocation,而使用ARC则更是如此。对于你使用NSInvocation的任何东西,通常都有更好的选择。如果必须使用NSInvocation,则需要记住它只处理原始字节blob并且根本不处理对象所有权,因此传递ARC管理的指针不是犹太教。您希望将返回值变量设置为void指针,然后使用桥接转换将其分配给普通的对象类型变量。