2010-05-24 10 views
7

Non sono riuscito a trovare un esempio funzionante del metodo [NSDictionary getObjects:andKeys:]. L'unico example che ho trovato, non si compila. Ho fornito gli errori/avvisi qui nel caso qualcuno li stia cercando.Esempio di [NSDictionary getObjects: andKeys:]

Il motivo per cui ero confuso è perché la maggior parte dei metodi su NSDictionary restituisce un NSArray. Tuttavia, nello documentation indica che le variabili out di questo metodo vengono restituite come array C.

Qui ci sono i messaggi di errore/avvertenze si potrebbe ottenere se si segue l'esempio collegato:

NSDictionary *myDictionary = ...; 

id objects[]; // Error: Array size missing in 'objects' 
id keys[]; // Error: Array size missing in 'keys' 

[myDictionary getObjects:&objects andKeys:&keys]; 

for (int i = 0; i < count; i++) { 
    id obj = objects[i]; 
    id key = keys[i]; 
} 

.

NSDictionary *myDictionary = ...; 

NSInteger count = [myDictionary count]; 
id objects[count]; 
id keys[count]; 
[myDictionary getObjects:&objects andKeys:&keys]; // Warning: Passing argument 1 of 'getObjects:andKeys:' from incompatible pointer type. 

for (int i = 0; i < count; i++) { 
    id obj = objects[i]; 
    id key = keys[i]; 
} 

Fornirò una soluzione di lavoro come risposta a questa domanda.

risposta

12

Ecco il modo corretto per utilizzare questo metodo:

NSDictionary *myDictionary = [NSDictionary dictionaryWithObjectsAndKeys:@"1", @"A", @"2", @"B", nil]; 

NSInteger count = [myDictionary count]; 
id objects[count]; 
id keys[count]; 
[myDictionary getObjects:objects andKeys:keys]; 

for (int i = 0; i < count; i++) { 
    id obj = objects[i]; 
    id key = keys[i]; 
    NSLog(@"%@ -> %@", obj, key); 
} 
+0

cosa devo rilasciare obj e chiave? – Cesar

+0

Non rilasciare nulla nell'esempio di codice sopra riportato. –

+0

Nel caso in cui qualcuno si chiedesse perché non è necessario rilasciare nulla (questa è stata una cosa che mi ha ucciso all'inizio dello sviluppo) è perché nulla è stato assegnato. Nessuna memoria allocata = nessuna memoria necessaria per essere rilasciata. Ovvio ma se avessi visto questo qualche mese fa non avrei idea del motivo per cui non useresti il ​​rilascio :) – Elmo

8

Sotto ARC la soluzione deve essere modificata come segue (__unsafe_unretained aggiunti alle definizioni di matrice):

NSDictionary *myDictionary = [NSDictionary dictionaryWithObjectsAndKeys:@"1", @"A", @"2", @"B", nil]; 

NSInteger count = [myDictionary count]; 
id __unsafe_unretained objects[count]; 
id __unsafe_unretained keys[count]; 
[myDictionary getObjects:objects andKeys:keys]; 

for (int i = 0; i < count; i++) { 
    id obj = objects[i]; 
    id key = keys[i]; 
    NSLog(@"%@ -> %@", obj, key); 
}