为什么在使用ARC的快速枚举循环中需要__strong

当我做了一些simialr以下我得到一个错误说

for (UIView* att in bottomAttachments) { if (i <= [cells count]) { att = [[UIView alloc] extraStuff] } } 

Fast Enumeration variables cannot be modified in ARC: declare __strong

__strong做什么的,为什么我要添加它?

如果一个variables是在Objective-C快速枚举循环的条件下声明的,并且该variables没有显式所有权限定符,那么它使用const __strong限定,并且在枚举期间遇到的对象实际上不被保留。

合理
这是一个可能的优化,因为快速枚举循环承诺在枚举期间保留对象,并且集合本身不能被同步修改。 可以通过用__strong显式限定variables来覆盖它,这将使variables再次变为可变的,并使循环保留它遇到的对象。

资源

正如Martin在评论中指出的那样,值得注意的是,即使使用了__strongvariables,通过重新分配它,您也不会修改数组本身,但是您只需将局部variables指向不同的对象即可。

在迭代数组的同时对数组进行变换在任何情况下通常都是一个坏主意。 迭代时只需构build一个新的数组,你就会好起来的。

为什么你为这个指针分配一个新的值呢? 你想要replace数组中的对象吗? 在这种情况下,您需要在集合中保存要replace的内容,并在枚举之外进行操作,因为枚举时不能改变数组。

 NSMutableDictionary * viewsToReplace = [[NSMutableDictionary alloc] init]; NSUInteger index = 0; for(UIView * view in bottomAttachments){ if (i <= [cells count]) { // Create your new view UIView * newView = [[UIView alloc] init]; // Add it to a dictionary using the current index as a key viewsToReplace[@(index)] = newView; } index++; } // Enumerate through the keys in the new dictionary // and replace the objects in the original array for(NSNumber * indexOfViewToReplace in viewsToReplace){ NSInteger index = [indexOfViewToReplace integerValue]; UIView * newView = viewsToReplace[indexOfViewToReplace]; [array replaceObjectAtIndex:index withObject:newView]; }