Вы не можете напрямую кодировать указатель, потому что когда вы разархивируете объекты, значение указателя будет совершенно другим. Я имею в виду, вы можете хранить его с
encodeValueOfObjCType:@encode(id) at:&m_pFarmer
но нет гарантии, что десериализованный указатель будет указывать на десериализованного фермера; на самом деле, очень вероятно, что этого не произойдет.
Если Barn
не владеет Farmer
, то Barn
не должен воссоздавать его при десериализации; в итоге вы получите новый Farmer
, который не отделен от исходного. Таким образом, вам нужен способ найти десериализованный экземпляр оригинального Фермера и заменить экземпляр Фермера Барна другим.
Кто-то владеет Farmer
, верно? Поэтому Barn
должен иметь метод findMyFarmer
, который просматривает все FarmerOwner
s и находит исходный экземпляр, который он должен использовать. (Может быть, сравнивая farmerID
ivar на Farmer
?) Как только это будет сделано, вы можете внедрить -[NSObject awakeAfterUsingCoder:(NSCoder *)]
на Barn
для запуска процедуры замены фермера.
Надеюсь, это имеет смысл. Посмотрите документацию об архивации и сериализации, особенно страницу Кодирование и декодирование объектов , чтобы узнать больше о замене объектов на лету.
Обновление
NSArchiver
s и NSKeyedArchiver
s поддерживают идею условного архивирования , (через encodeConditionalObject:
), в котором объект добавляется в архив, только если какой-то другой Объект в архиве уже добавлен. Документация гласит: " Как правило, условные объекты используются для кодирования слабых или не сохраненных ссылок на объекты. ". Так что, если ваш Farmer
уже архивируется, вам нужно добавить его, но если вы только кодируете свой Barn
без какого-либо фермера, то вам не захочется.
Обязательно ознакомьтесь с документацией, указанной выше.