Re: Why does NSArray count return NSUInteger?
Re: Why does NSArray count return NSUInteger?
- Subject: Re: Why does NSArray count return NSUInteger?
- From: julius <email@hidden>
- Date: Tue, 31 May 2011 10:36:34 +0100
On 31 May 2011, at 10:00, Alejandro Rodríguez wrote:
> Hey Julius,
>
> The reason for using NSUInteger on such a high level framework as Cocoa may not seem relevant but for the sake of completeness let me go down a road less explored by many of the other answers. I think using NSUInteger vs NSInteger is the result of a leaky abstraction. It's more than likely that it has to do with the underlying implementation of NSArray which is surely based on C arrays.
>
> If we go back to simpler times the use of Unsigned datatypes becomes really obvious. For example… C was introduced in 1969 when only 8 bit processors existed (16-bit processors were introduced in 1976) which means that using a unsigned index could let you work with an array of 256 (0-255) elements vs 128 (0-127). That alone justifies the decision completely.
>
> Let's explore the low level details a little more. Specifying the index of an Array is really specifying an offset from a given pointer, if for example you have a C Array in the stack then specifying a negative index will modify previous data in your code which could lead to data loss (or even infinite loops on some nicely engineered examples). However because of the nature of the stack modifying some pointer further down (unsigned) has a less ill effects (other than the well known buffer overflow security holes). When designing APIs the designer takes the possibility of error into account and it's usually preferred to expose errors that will cause the app to crash and burn in flames instead of subtly corrupting data or getting into some weird state that only crashes once every 6 months. For example:
>
> arr[(NSInteger)(0 - 2)] will corrupt data and it's likely that it won't crash.
> arr[(NSUInteger)(0 - 2)] will probably always crash.
>
> Finally there is the point of scope. Objective-C started being designed and used before 32-bit personal computers gained any traction so using unsigned values made a huge difference. This is much much earlier that Cocoa but NSArray is not part of the Cocoa framework but part of the Foundation Framework which has a much broader spectrum. NSArray is toll-free bridged with CFArray which being part of CoreFoundation is made to work cross-platform and thus should try to be as generic as possible. It may be hard to understand but in cases like these using the unsigned version is more flexible because it is less wasteful. Using the type that best represents the data is important here because using a signed integer to represent something that can only nonnegative would in fact be wasting half of the space.
>
> Designing API is very tricky because many things once introduced are set in stone (changing the interface would break existing applications) and many things, including the programmer's bad memory, are taken into account.
>
> Hope this helps.
> Regards,
>
> - Alej
>
Thanks.
Exactly what I was looking for.
Julius
http://juliuspaintings.co.uk
_______________________________________________
Cocoa-dev mailing list (email@hidden)
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:
This email sent to email@hidden