Доступ к массиву словарей в Objective-C - PullRequest
1 голос
/ 25 января 2012

Итак, с трудом разыменовывая некоторые данные, которые я загрузил в массивы и словари:

Внутри контроллера:

- (void)setupVendorsArray {
    self.vendorsArray = [NSArray arrayWithObjects:@"Toyota", @"Honda",nil];
}

- (void)setupProductFamiliesHash {

    NSArray *lowcost = [NSArray arrayWithObjects:@"Corolla", @"Fit",nil];
    NSArray *midrange = [NSArray arrayWithObjects:@"Camry", @"Accord",nil];
    NSArray *highend = [NSArray arrayWithObjects:@"Lexus", @"Acura",nil];
    NSArray *trucks = [NSArray arrayWithObjects:@"Tacoma", @"Ridgeline",nil];

    NSDictionary *lc = [NSDictionary dictionaryWithObjects:lowcost forKeys:self.vendorsArray]; 
    NSDictionary *mr = [NSDictionary dictionaryWithObjects:midrange forKeys:self.vendorsArray]; 
    NSDictionary *he = [NSDictionary dictionaryWithObjects:highend forKeys:self.vendorsArray]; 
    NSDictionary *tk = [NSDictionary dictionaryWithObjects:trucks forKeys:self.vendorsArray]; 

    self.productFamiliesHash = [NSArray arrayWithObjects:lc,mr,he,tk,nil];
}

В gdb print-object это приводит к productFamiliesHash:

(gdb) print-object self.productFamiliesHash
<__NSArrayI 0x6b2c760>(
{
    Toyota = "Corolla";
    Honda = "Fit";
},
{
    Toyota = "Camry";
    Honda = "Accord";
},
{
    Toyota = "Lexus";
    Honda = "Acura";
},
{
    Toyota = "Tacoma";
    Honda = "Ridgeline";
}
)

Но, судя по всему, я не могу получить доступ, например, к Toyota Corolla, что, как я ожидаю, я мог бы сделать так в gdb:

(gdb) p [[productFamiliesHash objectAtIndex:0] objectForKey:@"Toyota"]

Однако GDB дает:

Unable to call function "objc_msgSend" at 0x156408c: no return type information available.

Как разыменовать словарь в массиве?

Ответы [ 2 ]

4 голосов
/ 25 января 2012

Попробуйте использовать po вместо p.Для методов Objective-C p требует, чтобы вы привели результат:

(gdb) p (id) [[productFamiliesHash objectAtIndex:0] objectForKey:@"Toyota"]

Даже тогда вы не получите описание объекта, только значение указателя.

1 голос
/ 25 января 2012

Используйте взамен po (объект печати).Другая важная вещь заключается в том, что GDB должен знать точный тип объекта, прежде чем он сможет отправить ему сообщение напрямую, поэтому вам нужно просто привести его правильно:

po [(NSDictionary *)[productFamiliesHash objectAtIndex:0] objectForKey:@"Toyota"]
...