Estoy trabajando en algunas cosas de CoreAnimation. Un controlador de navegación con algunos controladores de vista. Y los controladores de vista tienen UISCrollViews para diferentes "páginas" de un "folleto". En cada página, puede haber algo de animación que se activa cuando el usuario cambia a esa página.variables estáticas dentro de bloques Objective-C?
Estaba intentando algo como esto (para animaciones de un golpe).
void (^animationBlock)() =
^{
static bool alreadyTriggered = NO;
if(alreadyTriggered)
return;
[CATransaction begin];
[CATransaction setCompletionBlock:
^{
alreadyTriggered = YES;
}];
// Do me some animations...
[CATransaction commit];
};
NSMutableDictionary* pageBlocks = [[NSMutableDictionary alloc] init];
[pageBlocks setObject:[animationBlock copy] forKey:<animation's name>];
[self.animationBlocks setObject:pageBlocks forKey:<some page number>];
[pageBlocks release];
[animationBlock release];
"El nombre de la animación" y "algún número de la página" son marcadores de posición para el bien de la explicación (que son literales NSString arbitrarias).
Y el código que desencadena estas animaciones es:
- (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView
{
int pageNumber = floor(self.scrollView.contentOffset.x/self.scrollView.frame.size.width);
NSMutableDictionary* pageBLocks = [self.animationBlocks objectForKey:[NSString stringWithFormat:@"page%i",pageNumber]];
[CATransaction begin];
for(id key in pageBLocks)
((void (^)())[pageBLocks objectForKey:key])();
[CATransaction commit];
}
Hasta aquí todo bien, solo que si hago estallar el folleto del mando de navegación (llamadas también conocido como dealloc en el folleto) ya continuación presiónelo de nuevo , el bool estático todavía está configurado.
Mis pensamientos:
- Am I conservando el bloque? No lo sé .. Estoy llamando a la versión después de agregarlo (con copia) al diccionario y también el método dealloc del folleto llama a la versión del diccionario.
- ¿Estoy guardando otra copia del bool estático en alguna parte? Mi primer bool se asigna cuando declaro el bloque como estático dentro del alcance de un método ... bien depende del esquema de registro de activación de Objective-C que no he examinado. Pero suponiendo que sí, esa copia se ha ido al liberar el objeto en popViewcOntroller. ¿Y otra copia de la invocación de copia en el bloque cuando se agrega al diccionario debería ser liberada cuando se mata el diccionario?
Estoy reteniendo todo el objeto del folleto en sí? No lo obtuve completamente de los documentos de Apple, pero dicen que si accedo a una variable de instancia por referencia me quedo. Intenté soltarme desde el interior del bloque y todo sigue funcionando bien ...
no creo que se debe mezclar con '' copy' Block_release() '[bloques de programación temas] (http: // desarrolladores. apple.com/library/ios/#documentation/Cocoa/Conceptual/Blocks/Articles/bxUsing.html#//apple_ref/doc/uid/TP40007502-CH5-SW1) –
¿eh? Esa es la forma de mover un bloque de la pila al montón – SaldaVonSchwartz
El documento sugiere que debe 'equilibrar un Block_copy() con Block_release()' y 'balance copiar o mantener con release (o liberación automática)' –