Frage

Ich versuche, Blöcke zu verstehen. Ich bekommen, wie sie normalerweise verwendet werden, wenn sie direkt an eine Methode übergeben. Ich bin jetzt Interesse an einem Block nehmen, speichern sie (beispielsweise) in einer Instanzvariablen und nannte es später.

Die Block Programmieranleitung macht es klingen wie ich das tun kann, durch Block_copy mit / halten den Block entfernt zu kopieren, aber wenn ich versuche, es zu laufen ich mein Programm zum Absturz bringen.

- (void) setupStoredBlock
{
    int salt = 42;
    m_storedBlock = ^(int incoming){ return 2 + incoming + salt; };
    [m_storedBlock retain];
}

Ich versuche, es zu nennen später:

- (void) runStoredBlock
{
    int outputValue = m_storedBlock(5);
    NSLog(@"When we ran our stored blockwe got back: %d", outputValue);
    [m_storedBlock release];
}

Wer noch keine Erkenntnisse haben? (Oder gibt es etwas, das ich nicht mit Blöcken zu bekommen?)

Vielen Dank!

War es hilfreich?

Lösung

Sie werden dies wollen stattdessen tun:

- (void) setupStoredBlock
{
    int salt = 42;
    m_storedBlock = Block_copy(^(int incoming){ return 2 + incoming + salt; });
}

Andere Tipps

Kopieren Sie einen Block, wenn Sie es wollen, um zu bleiben. Autofreigabe oder es freigeben, wenn Sie mit ihm fertig sind. Bewahren Sie es, wenn Sie einen langen Weg brauchen /* NOP */ zu buchstabieren.

@interface Foo : FooSuper {}
@property(copy) int (^storedBlock)(int);
@end

@implementation Foo
@synthesize storedBlock = mStoredBlock;

- (void)setupStoredBlock {
    self.storedBlock = ^{/*...*/};
    // or: mStoredBlock = [^{/*...*/} copy];
    // but this simple implementation violates the atomicity contract
}

- (void)runStoredBlock {
    int result = self.storedBlock(5);
    NSLog(@"%s: result = %d", __func__, result);
}
@end

• Wie alle lokalen Variablen, ein nicht-statischer Block auf dem Stapel vorhanden ist, und wird von dem Stapel, wie jede anderen lokale Variable geknallt wird, die nicht statisch erklärt hat.

• Block_copy () kopiert den Block aus dem Stapel auf dem Heap, wo alle malloc Instanzen existieren. Und wie alle neuen / kopieren Methoden, Block_copy () gibt einen Heap zugewiesen Objekt mit einem behalten zählen von 1. Ein Block ist ein Objective-Objekt, sondern doesnot entsprechen wie ein normales Objekt. Daher soll es keinen Unterschied zwischen Block_Release () und der Ziel-Release-Methode.

• In diesem Beispiel wird das Kopierverfahren einer Blockinstanz. Da das Ergebnis einer Block_copy Zuordnung () zu einer ID erfordert eine Typumwandlung, dass ich Donot falsch erhalten möchten. Das Kopierverfahren erlaubt die Blockvariable direkt an eine ID zugeordnet werden.

 - (void) setupStoredBlock
{
    int zStackLocalVariable = 42;
    iHeapAllocatedVariable = [^int(int aMore){ return zStackLocalVariable + aMore; } copy];
}

• ein Objekt statisch zu deklarieren ist es erforderlich ist physisch mit dem Code selbst zugeordnet werden. Ein Block, der statisch deklariert wird, ist Compiler von verbotenen Variablen außerhalb des eigenen Anwendungsbereich zugreifen. Aufgrund der Anforderungen einer statischen Blockes Erklärung, gehe ich davon aus, dass der Block auf dem Stapel irgendwie anders aus dem Block ist, die in dem Heap ist.

• Ein Block ist ein Ziel c Objekt, deren Klasse, deren Klassennamen und andere zugehörige Informationen, die ich noch nicht versucht zu holen, aber, wie Protokoll, Objekt und andere versteckte Objective-Klassen, ist es nicht zu NSObject entspricht. Wie alle Objective-Objekte, es muss jedoch entsprechen behalten / Release. ARC erstreckt behalten / Release Äquivalenzen in Core Foundation als auch Objekte, und wahrscheinlich, wenn nicht jetzt, dann schließlich in malloc / free Zuweisungen.

• Ich erwarte die wahre Motivation für eine gründliche Erforschung der mikeash.com , wie Apfel mag uns alle auf einige hyper theoritical Ebene wenig körperliche Bedeutung zu halten, auch wenn alles, was von Bedeutung ist physisch ist.

ARC und blockiert auch hier diskutiert

Es gab eine sehr schöne Präsentation zu diesem Thema auf den letzten WWDC (2010). Beschrieben, wie Blöcke wurden implementiert und warum müssen Sie Block_copy verwenden. Sie können einen Film aus der Präsentation herunterladen: http://developer.apple.com/itunes/?destination=adc .apple.com.4092414566 Der Film heißt: "Advanced Objective-C und Garbage Collection"

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top