gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 12:42:01 25 4
gpt4 key购买 nike

我有一个框架 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com