On 15 Feb 2013, at 01:25, Ken Thomases <k...@codeweavers.com> wrote:
> > > On Feb 14, 2013, at 8:30 AM, Uli Kusterer wrote: > >> On Feb 14, 2013, at 3:57 AM, Ken Thomases <k...@codeweavers.com> wrote: >>> Your question prompted me to try to design an analog of NSKeyedArchiver, >>> NSCode, and NSCoding that would generate the new object graph on the fly as >>> it went instead of producing a data object. The idea is that the copier >>> (the analog of the archiver/coder) would know which objects had already >>> been copied and so would avoid over-duplicating them in the new graph. >>> However, that ends up being hard because each object has to copy its >>> related object before it's complete enough to be registered with the >>> copier. So, it isn't successful in avoiding the potential for infinite >>> recursion. >> >> What NSKeyedArchiver probably does is have a dictionary that maps the >> original object pointer values to the copied objects. So instead of just >> straight-out copying an object, it does: >> >> NSString* theKey = [NSString stringWithFormat: @"%p", theOriginal]; >> id theCopy = [objectCopies objectForKey: theKey]; >> if( !theCopy ) >> { >> theCopy = [theOriginal copy]; >> [objectCopies setObject: theCopy forKey: theKey]; >> } >> >> That way, every object only gets copied once, and the copy re-used in other >> spots. That may be part of why it is slower. (NB - you could probably use an >> NSValue +valueWithUnretainedPointer: or whatever as the key, I just quickly >> typed this untested code into the e-mail) > > That's what I considered but it doesn't work. You can't add the copy into > the archiver's database of already-copied objects until it's complete. But, > for the case where the graph has cycles, making the complete copy will try to > make copies of all its related objects first. When the cycle loops back to > the same original, that original still does not have a copy in the database, > so it tries to make another copy. Infinite recursion. Why not keep a mutable dictionary M and on encountering an object (in the scanning phase) do: if object not in mutable dictionary M then add to M: key = address of object, value = NSNull continue walking the object tree else do nothing endif And in the second (copy) phase do: if value of object = NSNull then copy it and set the value in M to the copied object else just store a link to the already copied object. Should work with cycles. Might not be faster than NSArchive. Kind regards, Gerriet. _______________________________________________ Cocoa-dev mailing list (Cocoa-dev@lists.apple.com) Please do not post admin requests or moderator comments to the list. Contact the moderators at cocoa-dev-admins(at)lists.apple.com Help/Unsubscribe/Update your Subscription: https://lists.apple.com/mailman/options/cocoa-dev/archive%40mail-archive.com This email sent to arch...@mail-archive.com