1

我有一個for循環,然後通過迭代對象與一個按地址PARAM的方法,並得到了以下錯誤:ObjC/ARC的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; 

我按照this SO q&a的建議無濟於事。

編輯

前面加上一個& OBJ給我下面的錯誤之前:

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

回答

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

我試過了,我得到以下錯誤:將'Foo * const __strong *'發送給'Foo * __ autoreleasing *'類型的參數會改變指針 – sbonami

+0

的保留/釋放屬性。嘗試在我的編輯中建議使用橋樑 – sergio

+0

現在ARC只是一個痛苦:不兼容的類型將'Foo * const __strong *'轉換爲'Foo * __ strong *'與__bridge轉換 – sbonami

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 

任何的幫助?