1

我有一个 for 循环,然后将迭代对象传递给带有 byref 参数的方法并得到以下错误:

Implicit conversion of an Objective-C pointer to 'FOO *__autoreleasing *' is disallowed with ARC

和警告:

Incompatible pointer types sending 'Foo *const __strong' to parameter of type 'Foo *__autoreleasing *'

循环:

for (Foo *obj in objArray) {
    FooTableCell *newCell = [self createFooCellWithItem:obj];
}

方法签名:

-(FooTableCell *)createFooCellWithItem:(Foo **)newObj;

我已按照此 SO q&a中的建议进行操作,但无济于事。

编辑

在 obj 之前添加 & 会给我以下错误:

Sending 'Foo *const __strong *' to parameter of type 'Foo *__autoreleasing *' changes retain/release properties of pointer
4

2 回答 2

1

作为聊天中讨论和发现的简历,这里有几个注意事项。

您似乎正在尝试:

  1. 快速迭代数组;尽管

  2. 替换从循环内部调用的方法中的每个数组元素;

编译器不允许这样做。它至少会打破关于不修改枚举中的数组的快速枚举合同。

因此,我的建议是在您的方法中明确指定一个外参数shouldAddObject,例如:

NSMutableArray *newArray = [[NSMutableArray alloc] initWithCapacity:[objArray count]]; 
for (Foo *obj in objArray) {
    Foo* newObject = nil;
    RETYPE* ret = [self shouldAddObject:obj newObject:&newObject]; 
    [newArray addObject:newObject];
}
于 2013-01-16T17:57:41.410 回答
1

如果我记得数组都是指针的集合,那么您可能已经这样做了,在这种情况下,您只需要更改您的shouldAddObject

 -(void)shouldAddObject:(Foo *)newObj {
      // Do your thing
 }

或使用标志关闭该文件的 ARC -fno-objc-arc

但是,如果不是这种情况,您可以使用 ARC 执行此操作:

 - (void)swapObjCPointers:(id*)ptrA with:(id*)ptrB {

     // Puts pointer B into pointer A
     id this = *ptrB;
     *ptrB = *ptrA;
     *ptrA = this;

 }

例子:

@implementation MyARCFile

 - (void)swapObjCPointers:(id*)ptrA with:(id*)ptrB {

     // Puts pointer B into pointer A
     id this = *ptrB;
     *ptrB = *ptrA;
     *ptrA = this;

 }


- (void)example {

     id objA = [NSObject new];
     id objB = @"String";

     NSLog(@"\n"
           @"a: %p\n"
           @"b: %p\n",
           objA,
           objB);

     [self swapObjCPointers:&objA with:&objB];

     NSLog(@"\n"
           @"a: %p\n"
           @"b: %p\n",
           objA,
           objB);
 }

 @end

有什么帮助吗?

于 2013-01-16T18:02:14.067 回答