цель c: передача аргумента char в функцию приводит к сбою приложения - PullRequest
0 голосов
/ 16 февраля 2011

Я написал синглтон под названием SomeValues, где я инициализирую массив foo NSMutableArray. Затем я попытался написать функцию SetBFSV, чтобы установить значения этого массива из разных управляющих представлений.

@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];
}

Я знаю, что setValue требует NS-объекта как для значения, так и для ключа, но я не могу объявить свою функцию как

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

потому что он не компилируется с ошибкой: «Невозможно использовать объект в качестве параметра метода».

В одном ControlView я написал тогда этот кусок кода:

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

При компиляции я получаю предупреждение в последней строке:

предупреждение: передача аргумента 1 из SetBFSV: ToVal: делает целое число из указателя без приведения

Какое целое число? Я становлюсь глупым, осматривая это. При запуске я получаю распечатку из NSLog, но сразу после этого программа явно вылетает с этой ошибкой:

'NSInvalidArgumentException', причина: '- [NSPlaceholderString stringWithFormat:]: нераспознанный селектор, отправленный экземпляру 0x4e03280'

Очевидно, что я передаю что-то не так в stringWithFormat, но я не могу понять, что.

Спасибо за любую помощь. Хорошего дня!

/ Luca

Ответы [ 2 ]

2 голосов
/ 16 февраля 2011

Возможные проблемы с вашим кодом (если в нем нет опечаток):

  1. - (void) SetBFSV:(char)lbl ToVal:(long)BFSvl функция ожидает символ в качестве 1-го параметра, но вы передаете ему символ * - ваше 1-е предупреждение, вероятно, отсюда
  2. stringWithFormat - метод класса, поэтому ваш код должен выглядеть так:

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

    или

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

    поскольку вы пытаетесь использовать -stringWithFormat вместо +stringWithFormat, вы получаете сбой

  3. Если вы передадите char в функцию, корректный спецификатор формата для нее будет% c, а не% s

  4. Вы, вероятно, должны освободить переменную Strlbl, если вы создадите ее с помощью alloc / init, иначе она утечет (но вы не должны освобождать ее, если используете + stringWithFormat:)
1 голос
/ 16 февраля 2011

Например, вы не можете использовать объект в качестве параметра:

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

Вам нужно передать их как указатели, используя звездочку.

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

Кроме того, если вам нужно передать их как (char) и (long) ваш бит кода:

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?

Передает *Bar в качестве указателя. Вы должны действительно прочитать указатели и объекты. Если вам нужно передать их как (const char*) и (long) сделайте это так:

- (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];
}

Моя рекомендация заключается в следующем:

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

И назовите это следующим образом (из вашего примера):

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)
...