2010-05-24 30 views
7

[NSDictionary getObjects:andKeys:] yönteminin çalışma örneğini bulamadım. Bulduğum sadece example, derleme değil. Birilerinin onları aradığı sırada hataları/uyarıları burada sağladım.Örnek [NSDictionary getObjects: andKeys:]

Kafamın karışık olmasının nedeni NSDictionary üzerindeki çoğu yöntemin NSArray değerini döndürmesidir. Ancak, documentation'da, bu yöntemin çıkış değişkenlerinin C dizileri olarak döndüğü belirtilmektedir.

Burada bağlantılı örneği takip takdirde alabileceğiniz hata iletileri/uyarılar bulunmaktadır:

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]; 
} 

Bu soruyu yanıt olarak bir çalışma çözümü sağlayacağım.

cevap

12

Aşağıda, bu yöntemi kullanmak için doğru bir şekilde açıklanmıştır:

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); 
} 
çözeltisi (dizi tanımlarına ilave __unsafe_unretained) aşağıdaki gibi değiştirilmesi gereken
+0

i serbest bırakmak için gerekiyor obj ve anahtar? – Cesar

+0

Yukarıdaki kod örneğinde hiçbir şey bırakmayın. –

+0

Anyonlar neden bir şey salıvermeye ihtiyaç duyduğunuzu merak ettiyse (bu, beni erken gelişim aşamasında öldüren bir şeydi) çünkü hiçbir şey tahsis edilmedi. Hiçbir bellek tahsis edilmedi = serbest bırakılması gereken bellek yok. Açıkçası, ama bunu birkaç ay önce görmüş olsaydım, sürümünüzü neden kullanamayacağınıza dair hiçbir fikrim olmaz :) – Elmo

8

altında ARC:

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); 
}