2010-04-07 2 views
3

У меня есть изменяемый массив, который сохраняется и хранит несколько объектов. В какой-то момент один объект может стать нулевым. Когда это произойдет, приложение выйдет из строя, потому что массивы не могут иметь нулевые объекты. Представьте себе что-то вродеiphone - mutableArray не может хранить объекты nil

[object1, object2, object3, nil];

тогда, object2 = ноль

[object1, ноль, object3, ноль];

это невозможно, потому что nil - конец маркера массива. Итак, как я могу это решить? спасибо за любую помощь.

ответ

9

Используйте [NSNull null], если вам нужно сохранить пустой объект-заполнитель.

Например:

NSArray * myArray = [NSArray arrayWithObjects:obj1, [NSNull null], obj3, nil]; 

myArray будет содержать 3 объекта. При извлечении объекта, вы можете сделать простой тест указатель равенства, чтобы увидеть, если это Null синглтон:

id object = [myArray objectAtIndex:anIndex]; 
if (object == [NSNull null]) { 
    //it's the null object 
} else { 
    //it's a normal object 
} 

EDIT (в ответ на комментарий)

@ Mike Я думаю, что вы получаете путают с тем, что происходит на самом деле.

Если у вас есть:

id obj = ...; 

Тогда obj содержит адрес. Он не содержит объекта. Таким образом, если вы делаете NSLog(@"%p", obj), он напечатает что-то вроде 0x1234567890. Когда вы помещаете obj в массив, он не копирует объект, он копирует адрес . Таким образом, массив фактически содержит 0x1234567890. Поэтому, когда вы позже выполните: obj = nil;, вы воздействуете на указатель за пределами из массива. Массив будет содержать 0x1234567890.

+0

Спасибо, но дело в этом. Я не храню ничто. Когда массив был создан, объект был не ноль, но после этого он стал нулевым. Таким образом, чтение массива приведет к сбою. Итак, что ты имеешь в виду? вы можете уточнить? – SpaceDog

+2

В этом случае у вас есть ошибка. Объекты в массиве сохраняются массивом. В нормальном случае авария, о которой вы говорили, никогда не должна произойти, потому что объект не будет освобожден до тех пор, пока массив не освободит объект. В вашем случае где-то в вашем коде есть либо отсутствующий, либо вы освобождаете хотя бы один раз больше, чем нужно. Это приводит к тому, что объекты в изменяемом массиве будут освобождены, пока массив все еще ссылается на объект. – Giao

+0

@Mike отредактированный ответ. –

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