2016-07-27 1 views
0

Ich denke, es ist lustig über die apienumerateKeysAndObjectsUsingBlock BOOL * Stop

- (void)enumerateKeysAndObjectsUsingBlock:(void (^)(KeyType key, ObjectType obj, BOOL *stop))block 

ich den Parameter stop.At zum ersten Mal bemerkt, ich denke, es ist eine Art von (BOOL *), das ich nie Das Dokument sagt

seen.But haben

Diskussion Wenn der Block * stop auf YES setzt, wird die Enumeration gestoppt.

Es scheint wie der Parameter namens * stop, und ich lösche * wird einen Fehler erhalten.

Ich frage mich, warum?

+0

Was meinst du mit 'Ich lösche * wird ein Fehler erhalten? Ich kann antworten, warum der Parameter "BOOL" ist, aber ich verstehe nicht, was du mit dem zweiten Teil deiner Frage meinst. – Majster

Antwort

1

Ich denke, das eine sehr grundlegende Frage nach der C-Sprache ist auf dem Objective-C beruht. Sie sind nicht vertraut mit Zeigern?

stop ist ein Parameter des Blocks. Sein Typ ist BOOL* was bedeutet "ein Zeiger auf BOOL".

Irgendwo in der Implementierung von -enumerateKeysAndObjectsUsingBlock: ist Code, der Block Sie supllied aufruft. Dieser Code hat Speicherplatz für einen BOOL-Wert erstellt. Es übergibt den Zeiger an (a.k.a. Adresse von) diesem Speicher an Ihren Block, damit Ihr Block den Wert an diesem Speicherort ändern kann, indem Sie über den Zeiger schreiben.

Die Anweisung *stop = YES; weist BOOL den Wert YES zu, auf den die Variable stop zeigt. Das habe ich oben mit "durch den Zeiger schreiben" gemeint. Auf diese Weise hat der Block eine Variable des Aufrufers modifiziert, so dass der Aufrufer weiß, dass der Block die Aufzählung stoppen möchte.