Cuando hago algo similar a lo siguiente, aparece un error que dice
for (UIView* att in bottomAttachments) {
if (i <= [cells count]) {
att = [[UIView alloc] extraStuff]
}
}
Fast Enumeration variables cannot be modified in ARC: declare __strong
Que hace __strong
hacer y por qué debo agregarlo?
Respuestas
15 para la respuesta № 1Si una variable se declara en la condición de un bucle de enumeración rápida de Objective-C, y la variable no tiene un calificador de propiedad explícito, entonces se califica con
const __strong
y los objetos encontrados durante la enumeración no se retienen realmente.Razón fundamental
Esta es una optimización hecha posible porquelos bucles de enumeración rápida prometen mantener los objetos retenidos durante la enumeración, y la colección en sí no puede modificarse sincrónicamente. Se puede anular calificando explícitamente la variable con__strong
, lo que hará que la variable sea mutable nuevamente y hará que el bucle retenga los objetos que encuentra.
Como Martin señaló en un comentario, vale la pena señalar que incluso con un __strong
variable, al reasignarlo no modificará la matriz en sí, sino que hará que la variable local apunte a un objeto diferente.
En cualquier caso, mutar una matriz mientras se repite es generalmente una mala idea. Simplemente construya una nueva matriz mientras itera y estará bien.
0 para la respuesta № 2
¿Por qué está asignando un nuevo valor a ese puntero?¿de todas formas? ¿Estás tratando de reemplazar un objeto en la matriz? En ese caso, debe guardar lo que desea reemplazar en una colección y hacerlo fuera de la enumeración, ya que no puede mutar una matriz mientras se enumera.
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];
}