Domanda

Posso definire una lezione con una proprietà per accedere ai miei Ivars dall'esterno della classe.

Posso anche usare la sintassi di Myinst-> Ivar per accedere in modo c-struttura.

In C ++, andrei con gli accessori, ma in Objective-C ci sono alcuni casi in cui potrei desiderare un accesso diretto. Il sistema di messaggistica comporta un grande successo delle prestazioni con l'accessor che conta in alcuni contesti, poiché il messaggio non è inlineato come può essere con i metodi C ++.

Ad esempio in una classe che ha un Ivar chiamato Scalar e una proprietà definita su di esso. Scalar è un semplice valore galleggiante:

-(void) doWorkWithMyClass:(MyClass*)myinst
{
   // array and other locals declaration omitted 
   for (int i = 0; i < reallyBigX; i++) {
      result += [myinst scalar] * array[i];
      [myinst computeNextScalar:i];
   }
}

Se cambio [myinst scalar] in myinst-> scalare, il metodo funzionerà molto più velocemente, poiché l'utilizzo delle chiamate con l'accessor occuperebbe la maggior parte della CPU in questo ciclo.

Come con C ++, capisco che l'accesso a Ivar diretto è in generale scoraggiato, ma in questo contesto, quando la velocità conta, è accettabile? In caso contrario, esiste un metodo più preferito che utilizza ancora una classe Objective-C?

È stato utile?

Soluzione

Molte cose diventano accettabili quando ha un impatto significativo sulle prestazioni, ma nell'esempio che stai dando, sembrano esserci soluzioni molto migliori.

Innanzitutto, perché no [myinst computeNextScalar:i] Restituire il nuovo scalare? Se lo facessi, non avresti bisogno di prenderlo e tutto sarebbe molto più veloce.

Non può essere spostato il lavoro myinst? Voglio dire, non puoi creare qualcosa di simile:

result = [myinst totalOverArray:array];

Se reallyBigX è davvero grande, allora dovresti considerare l'accelerazione.framework qui. Può migliorare significativamente le prestazioni sul tipo di operazione che sembri fare. (Devi fare test sulle prestazioni con il framework Accelerate. Può essere sostanzialmente più lento per alcune operazioni, ma questo potrebbe essere più veloce.)

Infine, considera l'obiettivo-C get... modello. Sembra questo:

int *scalars = calloc(reallyBigX, sizeof(int));
[myinst getScalars:scalars range:NSMakeRange(0, reallyBigX)];
for (int i = 0; i < reallyBigX; i++) {
   result += scalars[i] * array[i];
}
free(scalars);

A proposito, quanto sopra è sicuramente un candidato per vDSP_dotpr(), anche se dovresti testimoniare. In molti casi il semplice ciclo è più veloce di un equivalente vDSP Chiama quando STRIDE = 1 (poiché è possibile utilizzare un semplice incremento anziché += stride).

Altri suggerimenti

Sì, è accettabile: il @public, @private, ecc. I modificatori di accesso sono stati introdotti in parte per supportare i progetti in cui è richiesto l'accesso a IVAR all'esterno della classe. Tuttavia, dovresti evitare di scrivere direttamente a Ivars.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top