gpt4 book ai didi

objective-c - 如何为对象指针指针(id *)选择 ARC 桥接说明符?

转载 作者:搜寻专家 更新时间:2023-10-30 19:46:40 25 4
gpt4 key购买 nike

我在 NSArray 上写了一些方便的方法,它的工作方式类似于 PHP 的 list() 函数,用于将数组“解包”为不同的对象:

- (void)unpackInto:(__strong id *)obj1, ...
{
__strong id *idPtr;
va_list args;
va_start(args, obj1);

idPtr = obj1;
NSUInteger idx = 0;
NSUInteger count = [self count];
while (idPtr != NULL && idx < count) {
*idPtr = [self objectAtIndex:idx];

// Increment the args and idx count
idx++;
idPtr = va_arg(args, __strong id *);
}
}

我最初有 __autoreleasing id * 但是当这个方法被调用时遇到了 EXC_BAD_ACCESS 问题(实际上是两次,如果重要的话)在一个线程上用它自己的自动释放池将内容解压到临时本地堆栈变量。当主线程出现并尝试自动释放内容时(再次),EXC_BAD_ACCESS 被抛出。

在这种情况下,任何人都可以帮助我遵循这些桥接参数的逻辑吗?我担心 __strong 会导致不太明显但同样邪恶的孪生兄弟:内存泄漏...

最佳答案

我没有看到您的源代码,但如果您从所有权方面考虑而不是保留/释放/自动释放池,则可以解决大多数 ARC 问题的答案。尝试回答,谁拥有数组,谁拥有解压缩的指针。如果我没理解错的话,你的调用方法看起来像这样

  NSArray *arr = [NSArray arrayWithObjects:@"a", @"b", @"c", @"d", nil];

NSString *a, *b, *c, *d;
[arr unpackInto:&a, &b, &c, &d, nil];

在访问解压缩的变量之前,您的数组是否已释放?请记住 __autoreleasing 不会将值“保留”到变量参数指针上。所以如果你的数组被释放,你的指针就会变成垃圾。我猜,您的 EXC_BAD_ACCESS 是因为您的主数组被释放了。

__strong 不应在您通过引用返回时使用。它不会增加保留计数。没有办法让 ARC 知道,这些变量要在调用方法中释放。所以 ARC 在它的范围之后释放它们。将分配的对象传递给调用方法并让调用方法释放的唯一方法是从属于 init 系列的方法返回它。当您跨方法边界返回值时,ARC 使用方法族(或宏 NS_RETURNS_RETAINED/NS_RETURNS_NON-RETAINED)来确定谁“拥有”指针。

如果传递常量指针(非回写指针),则可以使用 __strong 进行引用传递。事实上,对于没有所有权限定符的常量指针,隐含了 __strong。

更多关于这里的 LLVM 文档 http://clang.llvm.org/docs/AutomaticReferenceCounting.html#ownership.restrictions.pass_by_writeback

关于objective-c - 如何为对象指针指针(id *)选择 ARC 桥接说明符?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9445439/

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