Пример [NSDictionary getObjects: andKeys:] - PullRequest
8 голосов
/ 24 мая 2010

Я не смог найти рабочий пример метода [NSDictionary getObjects:andKeys:].Единственный пример , который я смог найти, не компилируется.Я предоставил здесь ошибки / предупреждения на случай, если кто-то их ищет.

Причина, по которой я был сбит с толку, заключается в том, что большинство методов NSDictionary возвращают NSArray.Однако в документации говорится, что переменные out этого метода возвращаются как массивы C.

Вот сообщения об ошибках / предупреждения, которые вы можете получить, если будете следовать связанному примеру:

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

Я предоставлю рабочее решение в качестве ответа на этот вопрос.

Ответы [ 2 ]

13 голосов
/ 24 мая 2010

Вот правильный способ использования этого метода:

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);
}
8 голосов
/ 10 августа 2012

В ARC решение необходимо изменить следующим образом (в определения массива добавлено __unsafe_unretained):

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