Tuesday, March 1, 2011

Encoding C Structs

I have a struct defined like follows as part of an object. I'm trying to encode this for use with NSCoder with the aim of saving as well as Undo/Redo functionality.

struct myCol {
    float rd;
    float grn;
    float blu;
    float alp;
} toolColor;

So, there are methods to encode e.g. -encodeBool:, -encodeFloat:, -encodeObject: etc. But how do you do this for a struct?

From stackoverflow
  • I think you should consider you struct myCol as memory buffer and encode it by something like encodeBytes function. Buffer length = size of your struct

    Jason Coco : You can either do it like this, as macropas says, or you can wrap it in an NSValue object.
    Joe : Thanks guys. Since an object is required I decided to use NSColor instead of struct. I guess I should have in the first place! But I'm learning.
    rgeorge : Actually, wrapping a struct in a plain NSValue *doesn't* make it encodable. Just learned this the hard way. Details why are in the apple docs, "Archives and Serializations Programming Guide for Cocoa", "Encoding and Decoding C Data Types". I made my own category similar to NSValue(NSValueUIGeometryExtensions) and it works great; but I've not yet found a way to add one paralleling NSCoder(UIGeometryKeyedCoding) and have it be used, short of subclassing NSValue.

0 comments:

Post a Comment