Sto lavorando su alcune cose di CoreAnimation. Un controller di navigazione con alcuni controller di visualizzazione. E i controller di visualizzazione hanno UISCrollViews per diverse "pagine" di una "brochure". In ogni pagina potrebbero esserci delle animazioni che vengono attivate quando l'utente si gira verso quella pagina.variabili statiche all'interno dei blocchi Objective-C?
Stavo provando qualcosa di simile (per le animazioni one-shot).
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];
"il nome di animazione" e "qualche numero di pagina" sono segnaposto per il bene della spiegazione (sono letterali NSString arbitrarie).
E il codice che fa scattare queste animazioni è:
- (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];
}
Fin qui tutto bene, solo che se ho pop la brochure dal controller di navigazione (aka chiama dealloc sul depliant) e spingerlo di nuovo , il bool statico è ancora impostato.
I miei pensieri:
- Sono mantenendo il blocco? Non so .. Sto chiamando rilascio dopo averlo aggiunto (con copia) al dizionario e anche il metodo dealloc della brochure chiama rilascio sul dizionario.
- sto mantenendo un'altra copia del bool statico da qualche parte? Il mio primo valore bool viene assegnato quando dichiaro il blocco come statico nell'ambito di un metodo .. beh dipende dallo schema di registrazione di attivazione di Objective-C che non ho esaminato. Ma supponendo di sì, quella copia è sparita quando si rilascia l'oggetto su popViewcOntroller. E un'altra copia di esso dal richiamo della copia sul blocco quando la si aggiunge al dizionario dovrebbe essere rilasciata quando il dizionario viene ucciso?
sto conservando l'intero oggetto brochure stesso? Non l'ho preso completamente dai documenti Apple, ma dicono che se accedo a una variabile di istanza per riferimento, mantengo l'io. Ho provato a liberare me stesso dall'interno del blocco e tutto continua a funzionare bene ...?
non credo che si deve mescolare '' copy' con Block_release() '[Blocchi di programmazione Argomenti] (http: // developer. apple.com/library/ios/#documentation/Cocoa/Conceptual/Blocks/Articles/bxUsing.html#//apple_ref/doc/uid/TP40007502-CH5-SW1) –
eh? Questo è il modo di spostare un blocco dalla pila all'heap – SaldaVonSchwartz
Il documento suggerisce di "bilanciare un Block_copy() con Block_release()" e "bilanciare copia o conservare con release (o autorelease)" –