/ / ¿Por qué se requiere __strong en los bucles de enumeración rápida con ARC - ios, Objective-C, xcode, conteo automático de ref

¿Por qué se requiere __strong en los bucles de enumeración rápida con ARC? Ios, object-c, xcode, automatic-ref-counting

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 № 1

Si 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.

fuente

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