2013-09-19 2 views
0

Я хочу направить NSMutableArray с очереди как селекторов одним из таких являетсяПочему мой код возвращает null?

- (id)dequeue { 
    id obj = nil; 
    if ([self count] > 0) { 
     id obj = [self objectAtIndex:0]; 
     if (obj != nil) { 
      [self removeObjectAtIndex:0]; 
     } 
    } 
    return obj; 
} 

Проблема заключается в том, что я ARC включена, и данные, которые obj точки на отпускается в removeObjectAtIndex: так dequeue всегда возвращает нуль.

Какой элегантный способ обойти это или мой подход совершенно неправильный?

Это было вызвано опечаткой и не имеет никакого отношения к ARC.

+1

Кроме того, нет необходимости проверять 'OBJ = nil' объект, возвращаемый из' objectAtIndex: 'никогда не может быть' nil' (если вы не облажались внутренние данные структура вашего массива). – Monolo

+4

Этот вопрос не соответствует теме, потому что речь идет о ошибке опечатки. – Monolo

+0

Изменен заголовок. – MdaG

ответ

5

У вас есть простая проблема с областью. Внутренняя переменная obj отличается от той, которую вы возвращаете. Измените код на это, и он должен работать

- (id)dequeue { 
    id obj = nil; 
    if ([self count] > 0) { 
     obj = [self objectAtIndex:0]; // removed "id" on this line since it created a new variable that and didn't assign to the one you were returning. 
     if (obj != nil) { 
      [self removeObjectAtIndex:0]; 
     } 
    } 
    return obj; 
} 
+0

DOH! Спасибо. Я соглашусь ответить, как только я позволю. – MdaG

+0

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

+0

@Monolo Насколько я знаю, он только предупредил бы, если внешняя 'obj' была переменной экземпляра. Меня действительно удивило то, что анализатор не нашел этого, когда я попробовал этот код только сейчас. –

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