2014-09-15 4 views
-3

self.filteredProducts = [[NSMutableArray alloc] init];Сбой при использовании removeObjectsInArray: [NSArray arrayWithArray:]

//Find products 
    self.filteredProducts = (NSMutableArray*)[(NSMutableDictionary *)[self.CECategoriesDictionary objectForKey:category.categoryGuid] allValues]; 

    if([self.oldfilteredProducts count] > 0 && selectedLevel==5) 
    { 
     NSMutableArray *diff = [self.filteredProducts mutableCopy]; 
     [diff removeObjectsInArray:[NSArray arrayWithArray:self.oldfilteredProducts]]; 
     [self.filteredProducts removeObjectsInArray:[NSArray arrayWithArray:diff]]; 
    } 

Журналы:

[__NSArrayI removeObjectsInArray]: непризнанные селектор направлен например 0x1aed19d0 2014-09-15 22: 00: 19,243 SAPRetailEx [10325: 90b] [ERROR]: неперехваченное исключение: - [__NSArrayI removeObjectsInArray:]: непризнанный селектор отправлен в экземпляр 0x1aed19d0 2014-09-15 22: 00: 19.243 SAPRetailEx [10325: 90b] [ERROR]: - [__ NSArrayI removeObjectsInArray:]: непризнанный селектор, отправленный в экземпляр 0x1aed19d0 2014-09 -15 22: 00: 19.248 SAPRetailEx [10325: 90b] [ОШИБКА]: (

+0

Вы можете попробовать использовать отладчик, чтобы проверить, что тип объекта из 'diff' это после того как она была установлена. Для этого нужно «NSMutableArray». Кроме того, при вызове 'removeObjectsInArray:' вам не нужно использовать 'NSArray arrayWithArray:'. Вы просто тратите впустую процессор и оперативную память, чтобы создать массив, который вам не нужен. – BergQuester

+1

Вы не можете мутировать неизменяемый объект. (Это то, что сообщение об исключении явно говорило вам.) –

ответ

2

вы не можете удалить объекты из формы NSArray; Я знаю, что вы думаете, что используете NSMutableArray, но это не так. Это сделано совершенно ясно из вашей ошибки [__NSArrayI removeObjectsInArray:]: unrecognized selector; __NSArrayI - неизменный объект (это то, что означает I), если бы это был действительно изменяемый массив, класс был бы __NSArrayM.

Вы, кажется, работаете под ложным впечатлением, что можете получить изменчивый массив просто путем литья NSArray до NSMutableArray; у этого никогда не было, как литье работает под любым C-производным языком. Вместо этого вам необходимо отправить сообщение mutableCopy на номер NSArray. Конечно, теперь у вас есть копия , поэтому модификации arent отражены в оригинале. вы также являетесь владельцем копии, поэтому, если вы не используете ARC, вам нужно сделать release копию, когда вы закончите.

Мне также интересно узнать, почему у вас уже есть mutableCopy из self.filteredProducts, а затем вы пытаетесь удалить прямо с self.filteredProducts. даже если это сработало, как вы ожидаете, что теперь вы копируете массив без причины, а затем удаляете как «оригинал», так и «копию».

+0

Как я могу преобразовать self self.filteredProducts в NSMutableArray, чтобы я мог удалить из него объект, который является таким же в массиве diff, сколько мне нужно. –

+0

@NehitGurubaxani вам нужно объявить self.filteredProducts как 'NSMutableArray', тогда, где вы назначаете' NSArray', вы вместо этого выполняете 'self.filteredProducts' = [theArray mutableCopy]'. Однако, глядя на ваш код, который будет таким же, как 'diff', поэтому я не знаю, что вы пытаетесь сделать. –

0

self.filteredProducts на самом деле не NSMutableArray Это нормальный NSArray, который не имеет опции «удалить».

[self.filteredProducts removeObjectsInArray:[NSArray arrayWithArray:diff]

Чтобы помочь в будущем ... установить в точке разрыва в коде после того, как вы назначаете его, а затем распечатать описание и посмотреть, какой тип объекта, на самом деле. либо po в отладчике, либо щелкните правой кнопкой мыши «Печать описания». Не верьте тому, что говорится на левой панели, это именно то, что вы сказали в коде, объект, посмотрите на описание справа, чтобы увидеть, что это на самом деле.

enter image description here

Смежные вопросы