开发者

objective c: passing a char argument to function crashes the app

开发者 https://www.devze.com 2023-02-11 07:34 出处:网络
I wrote a singleton called SomeValues where I initialize a foo NSMutableArray. I then tried to write a function SetBFSV to set the values of this array from different control views.

I wrote a singleton called SomeValues where I initialize a foo NSMutableArray. I then tried to write a function SetBFSV to set the values of this array from different control views.

@interface SomeValues : NSObject {
NSMutableArray *foo;}
+ (SomeValues *) sharedInstance;

@implementation

...

- (void) SetBFSV:(char)lbl ToVal:(long)BFSvl{
NSNumber *ValueBFSvl = [NSNumber numberWithLong:BFSvl];
NSString *Strlbl = [[NSString alloc] stringWithFormat:@"%s",lbl];
[foo setValue:ValueBFSvl forKey:Strlbl];
}

I know that setValue requires a NS object for both the value and the key, but I cannot declare my function as

(void) SetBFSV:(NSString)lbl ToVal:(NSNumber)BFSvl

because it doesn't compile with the error: "Can not use an object as parameter to a method".

In one ControlView I wrote then this piece of code:

SomeValues *myBFSV = [SomeValues sharedInstance];
const unsigned char *Bar = (unsigned char *)[@"Label1" UTF8String];
NSLog(@"The string %s", Bar);
[myBFSV SetBFSV:Bar ToVal:2.5];

When compiling I get a warning on the last line:

warning: passing argument 1 of 'SetBFSV:ToVal:' makes integer from pointer without a cast

Which integer? I'm getting stupid looking around for it. When running I get the print out from the NSLog, but right afterwards the program obviously crash开发者_如何学编程es with this error:

'NSInvalidArgumentException', reason: '-[NSPlaceholderString stringWithFormat:]: unrecognized selector sent to instance 0x4e03280'

Clearly I'm passing something wrong to stringWithFormat but I cannot understand what.

Thanks for any help. Have a nice day!

/luca


Possible problems with your code (unless you have typos in it):

  1. - (void) SetBFSV:(char)lbl ToVal:(long)BFSvl function expects char as its 1st parameter but you pass it a char* - your 1st warning probably comes from here
  2. stringWithFormat is a class method so your code should look either:

    NSString *Strlbl = [[NSString alloc] initWithFormat:@"%s",lbl];
    [foo setValue:ValueBFSvl forKey:Strlbl]
    

    or

    NSString *Strlbl = [NSString stringWithFormat:@"%s",lbl];
    [foo setValue:ValueBFSvl forKey:Strlbl]
    

    since you try to use -stringWithFormat instead of +stringWithFormat you get a crash

  3. If you pass char to a function then correct format specifier for it will be %c, not %s

  4. You probably must release your Strlbl variable if you create it with alloc/init otherwise it will leak (but you must not release it if you use +stringWithFormat:)


For one, you can't use an object as a paramter:

(void) SetBFSV:(NSString)lbl ToVal:(NSNumber)BFSvl

You need to pass them as pointers, using the asterisk.

(void) SetBFSV:(NSString*)lbl ToVal:(NSNumber*)BFSvl

Furthermore, if you need to pass them as (char) and (long) your bit of code:

SomeValues *myBFSV = [SomeValues sharedInstance];
const unsigned char *Bar = (unsigned char *)[@"Label1" UTF8String];
NSLog(@"The string %s", Bar);
[myBFSV SetBFSV:Bar ToVal:2.5];  // in either case, this is a long.  why are you passing a double here?

Passes *Bar as a pointer. You should really read up on the pointers and objects. IF you need to pass them in as (const char*) and (long) do it like this:

- (void) SetBFSV:(const char*)lbl ToVal:(long)BFSvl{
NSNumber *ValueBFSvl = [NSNumber numberWithLong:BFSvl];
NSString *Strlbl = [NSString stringWithUTF8String: lbl]; // your old code had a memory leak here.  you need to either create an autorelease object, or release it after adding to `foo`
[foo setValue:ValueBFSvl forKey:Strlbl];
}

My Recommendation is to do the following:

- (void) SetBFSV:(NSString*)key ToVal:(long)val{
    NSNumber *value = [NSNumber numberWithLong:val];
    [foo setValue:value forKey:key];
}

And call it like the following (from your example):

SomeValues *myBFSV = [SomeValues sharedInstance];
NSString *Bar = [NSString stringWithString:@"Label1"];// this may not be necessary...
NSLog(@"The string %@", Bar);
[myBFSV SetBFSV:Bar ToVal:25]; // don't pass a decimal for a (long)
0

精彩评论

暂无评论...
验证码 换一张
取 消