2010-04-19 4 views
0

я объявил структуры в моем файле заголовка, как это:Может ли структура быть освобождена?

typedef struct { 
NSString *department; 
NSString *departmentId; 
} Department; 

Department currentDepartment; 

Эта структура находится в довольно простом классе. Я присваиваю значения struct в viewDidLoad. Перед тем как покинуть viewDidLoad, я вижу, что значения struct все еще существуют. После того, как пользователь нажмет элемент управления сегмента, я переназначаю значения структуры. Перед назначением значений я вижу, что два значения struct равны 0x0. У меня есть NSZombieEnabled, который распечатывание это, когда я мыши над структурой в то время как приложение работает и один из моих контрольных точек были поражены:

MyApp[25722:207] *** -[CFString _cfTypeID]: message sent to deallocated instance 0xfc0e90 

Я не создает экземпляр структуры или deallocating его , Как его можно освободить?

ответ

1

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

+0

Я не согласен, есть некоторые варианты использования, когда структура имеет больше смысла, чем легкий класс. Трюк идентифицирует эти редкие случаи :) – rpetrich

+0

@ rpetrich: Если вы говорите о структурах с объектами, эти случаи кажутся такими редкими, я думаю, что вы с большей вероятностью столкнетесь с хорошим случаем для небезопасных goto. – Chuck

+0

Структуры объектов часто используются в внутреннем представлении ОС iPhone на клавиатуре и автокоррекции (один пример) – rpetrich

1

Нет, структуры могут быть освобождены, но только если вы не сделаете это где-то в своем коде. То, что освобождается в этом случае, это строка, как видно из сообщения об ошибке. Проверьте объекты, которые вы используете, когда вы устанавливаете department и departmentId членов.

На самом деле вам нужно быть особенно внимательным к управлению памятью, когда вы назначаете объекты членам структуры. В этом случае вам может потребоваться отправить сообщение -retain в строки или изменить способ их создания, чтобы использовать alloc/init... или copy, а не stringWith... или другими способами.

+0

Уточнение: Структуры (в смысле типа) не могут быть освобождены, куски памяти могут. Вы никогда не передадите переменную типа struct в свободный, только указатели. – Chuck

+0

C structs может динамически выделяться с помощью malloc(), calloc() и т. Д. Если структура распределяется таким образом, она может (и должна) быть освобождена. Кажется, вы сбиваете с толку, что при * определении * переменной типа struct. (И да, конечно, адрес всего, что динамически распределено, должен храниться в переменной некоторого типа указателя.) – jlehr

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