objective-c - type - objective c subroutine




Caso d'uso di `oneway void` in Objective-C? (2)

Ho trovato una strana parola chiave in NSObject.h

- (oneway void)release;

Ho cercato sul web e ho imparato che si riferisce al passaggio di messaggi asincroni, che sembra simile al passaggio del messaggio di Erlang.

Sembra che questo possa fare molte cose interessanti. Quali sono alcuni buoni casi d'uso di questa parola chiave?


Secondo la documentazione di Apple, oneway è usato solo per oggetti distribuiti (e non per il multithreading).

Il modificatore di oneway viene utilizzato solo se l'oggetto è remoto. In questo caso la chiamata di rilascio può tornare in modo asincrono (prima che il metodo sia terminato). In una rete ha senso perché l'attesa di un messaggio di ritorno può richiedere del tempo.

Il metodo di rilascio non ha valore di ritorno e quindi chiamarlo può essere eseguito in modo asincrono. Al contrario, mantenere e autorelease restituire un id e quindi dobbiamo attendere il trasferimento del messaggio di ritorno in tutta la rete.


Sembra inoltre necessario eliminare un avviso con XCode 4.2 (LLVM). In particolare:

-(void) release { }

dà il seguente avviso in XCode 4.2 (con LLVM):

warning: Semantic Issue: Modificatori di oggetti distribuiti in conflitto sul tipo restituito nell'implementazione di 'release'

L'avviso può essere eliminato aggiungendo il modificatore di oneway:

-(oneway void) release { }

Questo è nell'implementazione di un singleton, quindi la release in realtà non fa nulla.

Questo è necessario (almeno per eliminare l'avviso) su iOS e OS X. Il protocollo NSObject nei documenti iOS definisce release as (oneway void) anche se non ci sono oggetti distribuiti in iOS. Sembra che LLVM lo prenda mentre GCC no.





use-case