Int o NSInteger come oggetto per il metodo argomento. Objective-C
-
22-09-2019 - |
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.
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
.