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

标签 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

框架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/

相关文章:

iphone - UINavigationController:推送的 View 何时收到 Dealloc 消息?

c# - 返回列表前清除 list 的方法好吗?

java - 为什么千位分隔符称为 "grouping separator"?

objective-c - 解析 Coldfusion 9 在 Cocoa Obj-C 中生成的 JSON 响应

linux - 哪些段受写时复制影响?

iphone - 二进制名称或应用程序名称:一样吗?

ios - 开头的函数返回值

objective-c - 永远签署应用程序

ios - 如何使用 CXSetGroupCallAction 添加群组通话

ios - 创建文件到应用程序文档文件夹