• Open Menu Close Menu
  • Apple
  • Shopping Bag
  • Apple
  • Mac
  • iPad
  • iPhone
  • Watch
  • TV
  • Music
  • Support
  • Search apple.com
  • Shopping Bag
 

Lists

Open Menu Close Menu
  • Terms and Conditions
  • Lists hosted on this site
  • Email the Postmaster
  • Tips for posting to public mailing lists
Re: NSNumber : method to return pointer to represented value
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: NSNumber : method to return pointer to represented value


  • Subject: Re: NSNumber : method to return pointer to represented value
  • From: "email@hidden" <email@hidden>
  • Date: Sat, 22 Feb 2014 12:58:02 +0000

On 22 Feb 2014, at 08:32, Ken Thomases <email@hidden> wrote:

> There's no one representation of an NSNumber's content.
I think that this is the foundation of things.

What there is is a reported representation as given by -objCType.

The docs say, as I am sure you know:

“
NSNumber

objCType
Returns a C string containing the Objective-C type of the data contained in the receiver.

- (const char *)objCType
Return Value
A C string containing the Objective-C type of the data contained in the receiver, as encoded by the @encode() compiler directive.
“

Now I don’t care know how NSNumber persists its value nor with what type it was initialised. What I do care about in this case is what -objCType returns.
If I create a NSNumber like so:

NSNumber *n = @((int)5);

Then [n objCType] returns “i”.
From this I conclude that the canonical/reported representation is an int and I proceed accordingly.
And that’s all that I require.

The Mono method declares I need a pointer to an int.
If my Obj-C argument id object says, yes, I have a canonical/reported int and provide a pointer to such, then we are good to go.

I can define a complex number class.
MYComplexNumber * cn = [MYComplexNumber complexNumberWithString:@“5,2"];
This can return “i” for -objCType and that’s okay.
Now if I initialise it with @“5.5,2” -objCType may respond with “f”.
Now that is not okay. I have a unexpected type but this is something that I can detect and handle, likely by raising an exception.

> Keep in mind that NSDecimalNumber is-a NSNumber

Your point about NSNumber subclasses such as NSDecimaNumber is well made and a case in point.
It turns out that NSDecimaNumber returns “d” for double.
My category will produce a pointer to a double representation of the NSDecimaNumber.
And that’s okay.
NSDecimaNumber instances can safely(!!) be used as arguments to Mono methods that take a double parameter.

My actual working solution for decimals is to use an intermediate string representation to transfer data between Cocoa and the MONO CLR.

Your point is correct though and the class cluster nature of NSNumber makes things more interesting.

#import <Cocoa/Cocoa.h>

int main(int argc, const char * argv[])
{
    NSNumber *n = [NSNumber numberWithInt:5];
    NSLog(@"[[NSNumber numberWithInt:5] objCType] = %s", [n objCType]);
    NSLog(@"[@((int)5) objCType] = %s", [@((int)5) objCType]);
    NSLog(@"[@((char)5) objCType] = %s", [@((char)5) objCType]);
    NSLog(@"[@((float)5) objCType] = %s", [@((float)5) objCType]);

    // from NSDecimalNumber.h
    // - (const char *)objCType NS_RETURNS_INNER_POINTER;
    // return 'd' for double
    NSDecimalNumber *dn1 = [NSDecimalNumber decimalNumberWithString:@"1.0"];
    NSLog(@"[dn1 objCType] = %s", [dn1 objCType]);

    NSDecimalNumber *dn2 = [NSDecimalNumber decimalNumberWithMantissa:1 exponent:0 isNegative:NO];
    NSLog(@"[dn1 objCType] = %s", [dn2 objCType]);

    // simple subclass detection fails on a class cluster
    if ([[n class] isSubclassOfClass:[NSNumber class]]) NSLog(@"n has invalid subclass");
    if ([[dn1 class] isSubclassOfClass:[NSNumber class]]) NSLog(@"dn1 has invalid subclass");

    // direct subclass detection is okay
    NSLog(@"dn1 class: %@", [dn1 class]);

    return 0;
}

Regards

Jonathan


_______________________________________________

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


  • Follow-Ups:
    • Re: NSNumber : method to return pointer to represented value
      • From: Graham Cox <email@hidden>
    • Re: NSNumber : method to return pointer to represented value
      • From: Ken Thomases <email@hidden>
References: 
 >NSNumber : method to return pointer to represented value (From: "email@hidden" <email@hidden>)
 >Re: NSNumber : method to return pointer to represented value (From: Fritz Anderson <email@hidden>)
 >Re: NSNumber : method to return pointer to represented value (From: "email@hidden" <email@hidden>)
 >Re: NSNumber : method to return pointer to represented value (From: Ken Thomases <email@hidden>)
 >Re: NSNumber : method to return pointer to represented value (From: "email@hidden" <email@hidden>)
 >Re: NSNumber : method to return pointer to represented value (From: Ken Thomases <email@hidden>)

  • Prev by Date: Re: NSNumber : method to return pointer to represented value
  • Next by Date: Re: Disabling screen capture
  • Previous by thread: Re: NSNumber : method to return pointer to represented value
  • Next by thread: Re: NSNumber : method to return pointer to represented value
  • Index(es):
    • Date
    • Thread