我有一个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
答案 0 :(得分:1)
作为讨论的简历和聊天中的发现,这里有几个注意事项。
您似乎正在尝试:
快速迭代数组;而
替换从循环内部调用的方法中的每个数组元素;
编译器不允许这样做。它至少会破坏关于不在枚举中修改数组的快速枚举合同。
我的建议是明确指定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
有任何帮助吗?