Вам нужно создать функцию, которая рекурсивно высвобождает структуру, что-то вроде:
void free_nodes(struct node *n)
{
if (n != NULL)
{
free_nodes(n->nextLink);
free_nodes(n->variationLink);
[n->comment release];
[n->move release];
free(n);
}
}
, а затем просто позвонить, что из вашего метода dealloc
:
- (void)dealloc
{
free_nodes(_root_node);
[super dealloc];
}
Другие комментарии:
- Вам понадобится ссылка на главную линию варианта, что эквивалентно
goBack
указатель, но для вариантов. Это позволит вам переходить обратно на главную линию любого узла, так как в настоящий момент нет возможности выполнить полную трансверсальность вашего дерева.
- Я бы переименовать
goBack
в prev
, nextLink
к next
и variationLink
к variation
, но это до вас, на самом деле.
- Вам необходимо сохранить ход, используя внутренний формат, а не как
NSString
. Строки должны генерироваться только во время отображения (в методе рисования вида). Это позволяет вам фактически использовать данные перемещения, вместо того, чтобы снова обрабатывать строку (очень дорого) и выполнять преобразование строк только во время отображения, позволяет вам изменять способ создания строки перемещения на основе пользовательских настроек (короткая алгебраическая нотация, длинная алгебраическая обозначать, координировать обозначение, используя шрифты с характерными символами, а не буквы и т. д.).
Edit после вопроса из OP: Для того, чтобы ваше дерево хранить несколько вариантов, нужно создать двусвязный список изменений. Поэтому узел будет частью двух двусвязных списков. Запись этого в C++ поможет, но я покажу это в C, если это то, что вы используете:
typedef struct node
{
Move move; // Holds the move (this can be done using a 32-bit unsigned integer).
struct node *prev;
struct node *next;
struct node *variation;
struct node *mainline;
NSString *comment;
} Node;
Здесь mainline
ссылка указывает на предыдущее изменение, которое NULL
если это магистральный ход.
Ходы 1.e4 e5 (1 ... Nf6 a4) (1 ... Nc6 b4) 2.Nc3 будет удерживаться с использованием такого дерева (если ссылки не показаны на узле, то они равны NULL
):
Я использую этот подход в шахматной программе я развиваю, и это очень хорошо работает. Повторить; Я отделяю данные (этот узел) от представления (строка, содержащая текст перемещения, отображаемый в пользовательском интерфейсе). Сгенерированные строки перемещения должны храниться совсем другим образом; возможно, Core Text, но я использую собственный метод.
Как насчет того, чтобы использовать free() для их выпуска? Вы можете сделать это в своей функции dealloc своего родителя или где-то еще ... –
Да, я упомянул об этом, но для этого мне нужно будет перейти от узла к узлу – amar
, или вы можете называть его рекурсивно, если вы его контролируете. –