2012-02-13 3 views
1

Я новичок в программировании на Obj C, поэтому я начну с начала У меня есть массив с некоторыми элементами NSNumber и NSString, я хочу заменить элементы NSString на элементы NSNumber. Я решил сделать это с тем, чтобы в конструкции получить новое значение NSMutableArray для всех элементов и NSMutableIndexSet их индексы, но когда я сделал это, я столкнулся с проблемами, вот он, я покажу вам свой код и журнал.Objective-C: определение индекса объекта в массиве

NSArray *oneMoreStack = [program copy]; 
NSLog(@" stack=%@",oneMoreStack); 
NSLog(@" show me index ind=%@",[oneMoreStack indexOfObject:@"x"]); 
NSMutableIndexSet *myVarIndexesSet; 
NSMutableArray *myVarsArray; 


for (id myVarConst in oneMoreStack) { 
    if([myVarConst isKindOfClass:[NSString class]]) 
    { 
     if([myVarConst isEqualToString:@"x"]){ 
      [myVarsArray addObject:myVarConst]; 
      NSLog(@"obj x=%@",myVarConst); 
      [myVarIndexesSet addIndex:[oneMoreStack indexOfObject:myVarConst]]; 
      NSLog(@"ind x=%@",[oneMoreStack indexOfObject:myVarConst]); 

     } 
} 

Когда я запускаю его журнал показать мне это:

Calculator[6306:f803] stack=(
    x, 
    2, 
    "+" 
) 
Calculator[6306:f803] show me index ind=(null) 
Calculator[6306:f803] obj x=x 
Calculator[6306:f803] ind x=(null) 
then crash [NSMutableArray replaceObjectsAtIndexes:withObjects:]: index set cannot be nil 

Итак, мой вопрос почему [oneMoreStack indexOfObject:myVarConst] возвращение null? Как я могу это исправить? Благодарю. Я не упоминаю этот код раньше, потому что проблема заключается в получении индексов.

после предыдущей части кода идет в этой части:

[stack replaceObjectsAtIndexes:[myVarIndexesSet copy] withObjects:[myVarsArray copy]]; 

после этого столкновения с сообщением об ошибке я упомянул ранее. Благодарю.

ответ

4

[oneMoreStack indexOfObject:myVarConst] возвращает NSUInteger, примитивный тип, а не объект.

В вашем NSLog вы используете% @, в котором говорится: «Эй, возьмите этот объект, который я передаю в качестве аргумента, позвоните на него -description и распечатайте его». К счастью, NSUInteger, в котором вы проходите, составляет 0, NSLog считает, что это нулевой объект, и вы не рушитесь. Если вызов -indexOfObject: возвращает не-0, вы, скорее всего, потерпите крах.

Попробуйте вместо этого:

// For iOS 
NSLog(@" show me index ind=%u", [oneMoreStack indexOfObject:@"x"]); 

или

// For 64-bit and 32-bit Mac OS X 
NSLog(@" show me index ind=%lu", (unsigned long)[oneMoreStack indexOfObject:@"x"]); 

Вы можете узнать больше о строковых форматах по адресу: Formatting String Objects

+0

да, я не думаю об этом, теперь необходимо войти шоу мне нужен индекс, но возникает еще один вопрос: если все отлично с индексами, почему сообщение об ошибке в журнале является «Завершить приложение из-за неотображенного исключения» NSInvalidArgumentException, причина: * * ** - [NSMutableArray replaceObjectsAtIndexes: withObjects:]: индексный набор не может быть nil' я сделал что-то не так, когда добавляю индекс в индексный набор? Благодарю. –

+0

Извините, я не заметил упоминания об аварии. Можете ли вы обновить свой qustion кодом, который вы вызываете, - [NSMutableArray removeObjectsAtIndexes:], - [NSMutableArray replaceObjectsAtIndexes: withObjects:] или - [NSMutableArray insertObjects: atIndexes:]? Благодаря! – iccir

+0

спасибо за помощь, я редактирую вопрос –

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