Предполагая, что вам нужно придерживаться прямой C, потому что это то, как все уже настроено, то, что вам нужно сделать, на самом деле довольно просто.
Просто напишите функцию C, чтобы записать ваше дерево на диск, с некоторым предположением о порядке упорядочения (например, вы пишете нашу глубину сначала слева направо). Для любых объектов Objective C закодируйте их в NSData и запишите их размер и байты как часть вашего потока.
Когда вы читаете данные обратно, просто воссоздайте дерево, основываясь на ваших предположениях о порядке упорядочения, и устанавливайте указатели на детей. Разархивируйте любой из вложенных объектов Objective-C соответствующим образом.
Вероятно, вы можете как-то сделать это с NSCoder, но может быть проще выполнить реконструкцию дерева вне этого, так как вы можете перебирать дерево, передавая любые аргументы, которые вам нравятся, что на самом деле не очень легко с NSCoding. *
У меня есть некоторый код (Desktop OS X), который делает что-то очень похожее на это без встроенных объектов, но это довольно неудобно, и я не могу опубликовать его.
Одна оптимизация в этом коде состоит в том, чтобы считывать данные во внутренний буфер, кусками МБ (а не небольшим количеством байтов за раз для каждой структуры), а затем читать данные из этого буфера, хотя я Я не уверен, что когда-либо тестировался, и это может или не может иметь существенное значение на iPhone в любом случае. Похоже, что есть аналогичная оптимизация для записи, которая, как я понимаю, скорее всего будет выигрышной (записи iPhone стоят дорого, или я так слышал).