Domanda

Sto avendo qualche difficoltà a passare un numero come un argomento per un metodo:

- (void)meth2:(int)next_int;

E per chiamare quel metodo che ho bisogno di questo:

int next_int = 1;
[self performSelectorOnMainThread:@selector(meth2:) withObject:next_int waitUntilDone:NO];
//update next_int and call meth2 again

A questo punto, ho un "puntatore dalla intero senza un cast" di errore e sarebbe accaduto lo stesso con un NSInteger. Un NSNumber non è utile perché è immutabile, e ho bisogno di cambiare il valore costante. Qualsiasi idea di come posso fare questo?

Grazie.

È stato utile?

Soluzione

Se stai solo cercando di chiamare il metodo, è possibile utilizzare la sintassi standard:

[self meth2:next_int];

Se si ha realmente bisogno di utilizzare la performSelectorOnMainThread: si potrebbe avvolgere il numero in un NSNumber per la chiamata. Tu dici che non si può fare questo perché è necessario modificare il numero, ma si può solo tirare un int fuori e cambiare la situazione:

[self performSelectorOnMainThread:@selector(meth2:) withObject:[NSNumber numberWithInt:next_int] waitUntilDone:NO];
// ... later ...
- (void)meth2:(NSNumber *)number {
  int myInt = [number intValue];
  // do stuff with myInt
}

Ma forse vuoi dire che si desidera ottenere il valore del numero come uscita dalla chiamata a meth2. Se è questo che vuoi dire, allora si potrebbe passare in un doppio puntatore in modo da poter ricevere un nuovo oggetto indietro:

- (void)meth2:(NSNumber **)number {
  int myInt = [*number intValue];
  // do stuff with myInt
  *number = [NSNumber numberWithInt:myInt];
}
// The caller can now operate like this:
NSNumber *number = [NSNumber numberWithInt:next_int];
[self performSelectorOnMainThread:@selector(meth2:) withObject:&number waitUntilDone:YES];
int returnInt = [*number intValue];

Naturalmente, questo non è proprio thread-safe, quindi se si sta facendo cose con più thread, vorrei consigliare utilizzando la parola chiave @synchronized per l'accesso a variabili multi-thread-accesso, o la creazione di proprietà atomiche (vale a dire le proprietà non dichiarata come nonatomic).

Inoltre, meth è male per te !! haha

Altri suggerimenti

Avvolgere il numero intero in un NSNumber prima di passarlo:

int next_int = 1
NSNumber *theNumber = [NSNumber numberWithInt:next_int];
[self performSelectorOnMainThread:@selector(meth2:) withObject:theNumber waitUntilDone:NO];

Allora la vostra -meth2: metodo potrebbe essere simile a questa:

- (void)meth2:(NSNumber*)theNumber
{
    int next_int = [theNumber intValue];
    // do whatever
}

E 'un po' di un hack, ma questo funziona sotto ARC:

int next_int = 1;
[self performSelectorOnMainThread:@selector(meth2:) 
                       withObject:(__bridge id)(void*)next_int 
                    waitUntilDone:NO];

__ ponte parola chiave sarà dire al compilatore di ignorare il conteggio dei riferimenti sotto ARC, ma richiede un puntatore, in modo da avere prima di gettare l'int a un puntatore nullo stile C. Quando il metodo riceve il messaggio che tratterà tale puntatore oggetto come se fosse un numero intero.

Nota: Se si possono modificare il metodo di prendere un NSNumber al posto di un numero intero, che poi sarebbe la correzione "corretta". Purtroppo questo non è sempre possibile.

Non è possibile utilizzare next_int come withObject: perché non è un oggetto.

Cambia la chiamata a:

[self performSelectorOnMainThread:@selector(meth2:) 
      withObject:[NSNumber numberWithInt:next_int] waitUntilDone:NO];

EDIT: E cambiare meth2 attendersi un NSNumber invece di un int.

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