2015-01-05 3 views
-1

я создал многомерный массив следующим образом:- [__ NSCFNumber AddObject]: непризнанный селектор направил к экземпляру

NSMutableArray *subArray = [NSMutableArray arrayWithObjects:[NSString string], [NSNumber  numberWithInt:0], [NSMutableArray array], nil]; 
self.dataArray = [[NSMutableArray alloc] initWithCapacity:9]; 
for (int i = 0; i < 9; i++) { 
    [self.dataArray addObject:subArray]; 
} 

тогда, когда я пытаюсь получить доступ и изменить значение, как этого

NSNumber *num = self.dataArray[0][1]; 
int numInt = [num intValue]; 
NSNumber *newNum = [NSNumber numberWithInt:numInt + 1]; 
[self.dataArray[0][1] addObject:newNum]; 
// add item to dataArray 
NSMutableArray *tmpArr= self.dataArray[0][2]; 
[tmpArr addObject:item]; 
[self.dataArray[0][2] addObject:tmpArr]; 

но я 'получение

-[__NSCFNumber addObject:]: unrecognized selector sent to instance 

Что именно представляет собой проблема, я не понимаю, спасибо заранее!

+0

@HotLicks Я знаю, где это происходит, я просто не понимаю, почему ... – adambargh

+0

Читать простофиля. Ответы объясняют это. –

+0

(Что такое значение 'self.dataArray [0] [1]' ??) –

ответ

1

В первой строке вы лечащий объект в массиве как NSNumber (который, очевидно, есть):

NSNumber *num = self.dataArray[0][1]; 

И здесь вы относитесь к точно такой же объект, как NSMutableArray:

[self.dataArray[0][1] addObject:newNum]; 

Это не сработает, потому что этот объект является экземпляром NSNumber.

Я не знаю, чего вы достигли, поэтому я не могу помочь вам с правильным кодом, но вот где ваша проблема. Может быть, вы просто хотели написать:

[self.dataArray[0][2] addObject:newNum]; 

Вы, вероятно, следует прекратить использовать «внутренний массив» в качестве хранилища данных и коммутатора, используя собственный подкласс. В настоящее время ваш код в значительной степени не читается, использование надлежащих объектов для хранения ваших значений может значительно улучшить его.


Btw, ваш многомерный массив на самом деле просто один размер, потому что вы добавляете один и тот же массив несколько раз.

Вы, вероятно, хотите сделать это:

for (int i = 0; i < 9; i++) { 
    NSMutableArray *subArray = [NSMutableArray arrayWithObjects:[NSString string], [NSNumber numberWithInt:0], [NSMutableArray array], nil];  
    [self.dataArray addObject:subArray]; 
} 
0
NSNumber *num = self.dataArray[0][1]; 
int numInt = [num intValue]; 
NSNumber *newNum = [NSNumber numberWithInt:numInt + 1]; 
[self.dataArray[0][1] addObject:newNum];  // 3. also, possibly here 
// add item to dataArray 
NSMutableArray *tmpArr= self.dataArray[0][2]; // 1. here 
[tmpArr addObject:item];      // 2. and here 
[self.dataArray[0][2] addObject:tmpArr]; 

Вы получаете эту ошибку, потому что первая линия я отметил, tmpArr на самом деле типа NSNumber. NSNumber - кластер классов, поэтому вы видите __NSCFNumber. Все, что есть, это всего лишь частный подкласс NSNumber.

Таким образом, ошибка возникает, потому что вы пытаетесь вызвать addObject на тип объекта, который его не поддерживает. Лично я бы не хранили больше одного типа объекта в массиве, но я точно не знаю, что вы делаете. Предполагая, что вы не измените путь вы хранения вещей, что вы можете сделать это:

NSMutableArray *tmpArr= self.dataArray[0][2]; 
if ([tmpArr isKindOfClass:[NSMutableArray class]) 
{ 
    [tmpArr addObject:item];      
} 
else 
{ 
    NSLog(@"Woops, trying to add an object to something that's not a mutable array"); 
} 

Вы должны делать это каждый раз, когда вы пытаетесь сохранить объект в массив, который вы вытаскивая от self.dataArray. Это означает, что tmpArr - это то, что вы думаете.

В качестве альтернативы, вы можете проверить, если он отвечает на addObject

if ([tmpArr respondsToSelector:@selector(addObject:)]) 
{ 
    [tmpArr addObject:item]; 
} 

Второй путь не волнует, что класс это, только если метод addObject может быть использован.