On Nov 27, 2009, at 14:58, Shane wrote:

> I think I'm understanding this in part ...
> 
> // *.h
>       NSMutableData *pointData;
>       NSPointArray *points;
> 
> // *.m
>       pointData = [[NSMutableData alloc] init];
> 
>       ...
> 
>       NSPoint point = NSMakePoint([iters floatValue], [mse floatValue]);
>       // not sure how to get an NSPoint into NSMutableData?
> 
>       // here I resize NSMutableData, but this will always only be
>       // increasing the length by 1.
>       [pointData increaseLenghtBy:sizeof(NSPoint)];
> 
>       // and here I assign the data to NSPointArray
>       points = (NSPoint *) [pointData bytes];
> 
> And from here I can pass this NSPointArray around till I get to the
> point where I will use this data for my NSBezierPath. Will
> NSBezierPath (which takes an NSPointArray) be able to properly read
> from 'points' by doing the above?

In part, but not quite. Although Graham's advice was good, and might be a 
better approach, for completeness here's how this approach works.

You only need one instance variable:

        NSMutableData *pointData;

which you can initialize as above.

To add a point, I'd do something like this:

        NSUInteger pointCount = [pointData length] / sizeof (NSPoint);
        [pointData setLength: (pointCount  + 1) * sizeof (NSPoint)];
        NSPointArray points = [pointData mutableBytes];
        points [pointCount] = somePoint;

To add the points to a Bezier path:

        [somePath appendBezierPathWithPoints: [pointData mutableBytes] count: 
[pointData length] / sizeof (NSPoint)];

Note:

1. 'NSPointArray*' isn't the correct type for an array of points. Plain 
'NSPointArray' is what you want.

2. You will get a compiler warning if you try to assign [pointData bytes] to 
the NSPointArray variable, because the [point bytes] is of type 'const void*'. 
You need [pointData mutableBytes] which is just of type 'void*'.

3. There's no need to cast [point mutableBytes] to NSPointArray because there's 
no warning assigning from 'void*' to a compatible pointer type. Casting it is 
not wrong, but any time you write an explicit cast, you're overriding much of 
the compiler's type checking, so it's easy to introduce bugs that way. (Not 
likely in this case, but as a general consideration.) It's a personal thing, 
though -- I guess some people like to have the explicit cast because it 
documents what the code is supposed to be doing.




_______________________________________________

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:
http://lists.apple.com/mailman/options/cocoa-dev/archive%40mail-archive.com

This email sent to arch...@mail-archive.com

Reply via email to