#iphone #memory-management #linked-list
#iPhone #управление памятью #связанный список
Вопрос:
Я пишу приложение для iPhone, которое использует связанный список для отслеживания набора точек. Я снова и снова успешно использовал связанные списки в других программах на C, но я никогда не использовал связанный список на iPhone, и моя функция ‘freeList’ дает сбой.
pointNode * temp;
pointTrain = lPoints->next;
while (pointTrain) {
temp = pointTrain->next;
free(pointTrain);
pointTrain = temp;
}
Вот как я освобождаю свой список, ‘lPoints’ является заголовком и всегда выделяется во время выполнения. Этот код выполняется до добавления каких-либо дополнительных узлов, но, похоже, он все еще выполняется, даже если «pointTrain» равен NULL, что должно заставить его пропустить цикл while. К сожалению, цикл все еще выполняется, и программа завершает работу при освобождении (pointTrain)
Есть ли что-то, чего я просто не вижу?
Точки добавляются подобным образом в цикле:
pointTrain->x = onPx / trueWidth;
pointTrain->y = onPx % trueWidth;
pointTrain->next = (pointNode*)malloc(sizeof(pointNode));
pointTrain = pointTrain->next;
Комментарии:
1. Что такое pointNode? C-структура, класс Objective-C или структура / класс C ?
2. Почему бы вам не использовать NSMutableArray или что-то в этомроде?
3. Obj-C является строгим надмножеством C. Если вы написали связанные списки на C, они работают точно так же в Objective-C.
Ответ №1:
Один мудрый человек однажды сказал: «Я бы предпочел управлять лошадью в том направлении, в котором она движется».
Не создавайте свою собственную структуру, когда есть совершенно хороший NSMutableArray
класс, который вы могли бы использовать. Линейная итерация массива дешева и проста, а класс поставляется со своими собственными настройками управления памятью, и все, что вам нужно сделать, это ИСПОЛЬЗОВАТЬ их.
Это то, что я часто вижу у разработчиков C и C , которые переходят на Objective-C. Следующий проект на моей тарелке — отменить запуск проекта, на который один ОЧЕНЬ высокопоставленный специалист по C потратил последние шесть месяцев. Глядя на код, становится ясно, что он потратил почти все это время на споры с фреймворком. На данный момент он практически создал свой собственный фреймворк.
Ответ №2:
Вы явно инициализируете рядом с NULL
или nil
?
Если нет, то, скорее всего, для него уже установлено некоторое ненулевое значение, и поэтому while (pointTrain)
все равно будет установлено значение true.
Комментарии:
1. Я просто писал длинную версию того же ответа; malloc не дает никаких гарантий относительно содержимого любой возвращаемой памяти. Многие люди используют calloc или дополнительный вызов bzero как часть своего стандартного шаблона именно по этой причине. Помимо этого, среда выполнения Objective-C, предоставляемая на iPhone, является строгим надмножеством C, и применяются все обычные правила C, поэтому проблема, связанная с iPhone, на самом деле не должна быть проблемой.