For循环中的ObjC / ARC ByRef

时间:2013-01-16 17:52:37

标签: ios objective-c ios6 automatic-ref-counting pass-by-reference

我有一个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 *'

The Loop:

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

方法签名:

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

我按照this SO q&a的建议无效。

修改

预先安排&在obj给我以下错误之前:

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

2 个答案:

答案 0 :(得分:1)

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

您似乎正在尝试:

  1. 快速迭代数组;而

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

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

    我的建议是明确指定shouldAddObject方法中的out-parameter,例如:

    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];
    }
    

答案 1 :(得分:1)

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

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

或使用标记-fno-objc-arc关闭该文件的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

有任何帮助吗?