Ich arbeite an einigen CoreAnimation Sachen. Ein Navigationscontroller mit einigen View-Controllern. Und die View-Controller haben UISCrollViews für verschiedene "Seiten" einer "Broschüre". Auf jeder Seite gibt es möglicherweise eine Animation, die ausgelöst wird, wenn der Benutzer auf diese Seite umschaltet.statische Variablen innerhalb von Objective-C-Blöcken?
Ich war so etwas wie dies versuchen (für One-Shot-Animationen).
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];
„Animation Name“ und „einige Seitenzahl“ Platzhalter für Zwecke der Erläuterung sind (sie sind willkürlich NSString Literale).
Und der Code, der diese Animationen auslöst, ist:
- (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];
}
So weit so gut, dass nur, wenn ich die Broschüre aus dem Navigationscontroller Pop (aka dealloc auf der Broschüre nennt) und dann wieder einschieben Der statische Bool ist immer noch gesetzt.
Meine Gedanken:
- am Halte ich den Block? Ich weiß nicht .. Ich bin Release Aufruf nach dem Hinzufügen (mit Kopie) in das Wörterbuch und auch die dealloc Methode Broschüre nennt Release auf dem Wörterbuch.
- bin ich halten eine weitere Kopie der statischen Bool irgendwo? Mein erster Bool zugewiesen, wenn ich den Block als statisch im Rahmen eines Verfahrens zu erklären .. hängt gut auf Objective-C der Aktivierung Rekordschema, das ich in nicht aussehen. Aber vorausgesetzt, dass diese Kopie beim Freigeben des Objekts auf popViewcOntroller verschwunden ist. Und eine weitere Kopie des Aufrufs der Kopie auf dem Block beim Hinzufügen zum Wörterbuch sollte freigegeben werden, wenn das Wörterbuch beendet wird?
am Halte ich die ganze Broschüre Objekt selbst? Ich habe es nicht komplett aus den Apple Docs bekommen, aber sie sagen, wenn ich auf eine Instanzvariable per Referenz zugreife, behalte ich mich selbst. Ich habe versucht, mich selbst aus dem Block freizugeben und alles läuft gut ...?
Ich glaube nicht, sollten Sie 'mischen copy' mit' Block_release() '[Bausteinen Programmieren Themen] (http: // developer. apple.com/library/ios/#documentation/Cocoa/Conceptual/Blocks/Articles/bxUsing.html#//apple_ref/doc/uid/TP40007502-CH5-SW1) –
eh? Das ist der Weg, um einen Block vom Stapel auf den Haufen zu verschieben – SaldaVonSchwartz
Das Dokument schlägt vor, dass Sie eine Block_copy() mit Block_Release() 'und' Balance Kopie oder behalten mit Release (oder Autorelease) ' –