vancouver referencias online internet insertar harvard generador for convertidor citas citar bibliografia autocite apa objective-c ios ios5 automatic-ref-counting

objective-c - online - insertar referencias apa de internet



Recuento automático de referencias: error con enumeración rápida (2)

Al actualizar el código siguiente para usar el recuento automático de referencias para iOS 5, se produce un error cuando se asigna el buffer al "state-> itemPtr" cuando se intenta realizar una Enumeración rápida para que la clase implementadora se pueda iterar con el bucle "foreach" . El error que obtengo es "Asignar" __autoreleasing id * "a" __unsafe_unretained id * "cambios retención / liberación de las propiedades del puntero". Ver la línea de código con el comentario.

/* * @see http://cocoawithlove.com/2008/05/implementing-countbyenumeratingwithstat.html * @see http://www.mikeash.com/pyblog/friday-qa-2010-04-16-implementing-fast-enumeration.html */ - (NSUInteger) countByEnumeratingWithState: (NSFastEnumerationState *)state objects: (id *)buffer count: (NSUInteger)bufferSize { NSUInteger arrayIndex = (NSUInteger)state->state; NSUInteger arraySize = [_tuples count]; NSUInteger bufferIndex = 0; while ((arrayIndex < arraySize) && (bufferIndex < bufferSize)) { buffer[bufferIndex] = [_tuples objectAtIndex: arrayIndex]; arrayIndex++; bufferIndex++; } state->state = (unsigned long)arrayIndex; state->itemsPtr = buffer; // Assigning ''__autoreleasing id *'' to ''__unsafe_unretained id*'' changes retain/release properties of pointer state->mutationsPtr = (unsigned long *)self; return bufferIndex; }

La variable _tuples en este ejemplo es una variable de instancia de tipo NSMutableArray.

¿Cómo resuelvo este error?


Necesitas cambiar el buffer a __unsafe_unretained :

- (NSUInteger) countByEnumeratingWithState: (NSFastEnumerationState *)state objects: (id __unsafe_unretained *)buffer count: (NSUInteger)bufferSize

fuente

Editar: forma fácil de deshacerse del error en mutationPtr :

state->mutationsPtr = &state->extra[0];


Ziminji,

Tuve el mismo problema, así es como me encontré con esta pregunta.

Lo resolví manteniendo la definición del parámetro de los objects tal como está (por ejemplo, manteniéndolo como id * ) y en su lugar haciendo un molde doble utilizando un puntero de vacío.

Entonces, aunque esto generó errores para mí:

state->itemsPtr = (__unsafe_unretained id *)buffer // Error

Esto funcionó maravillosamente:

state->itemsPtr = (__unsafe_unretained id *)(void *)buffer // No error

Descargo de responsabilidad: no soy un experto en ARC y no puedo garantizarle que esto no cause problemas con los recuentos de referencia. Sin embargo, parece funcionar correctamente en mis pruebas, y definitivamente compila sin advertencias.

Por cierto, me encontré con esta entrada de blog de dos partes que cubre Fast Enumeration en una buena cantidad de profundidad:

y también esta entrada de blog en __unsafe_unretained :