繁体   English   中英

目标C:将char参数传递给函数会使应用程序崩溃

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

我写了一个名为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];

编译时,我在最后一行收到警告:

警告:传递'SetBFSV:ToVal:'的参数1将使指针产生整数而不进行强制转换

哪个整数? 我变得愚蠢到处寻找它。 运行时,我从NSLog中获取打印信息,但是此后程序显然因以下错误而崩溃:

'NSInvalidArgumentException',原因:'-[NSPlaceholderString stringWithFormat:]:无法识别的选择器已发送到实例0x4e03280'

显然,我给stringWithFormat传递了错误,但是我不明白是什么。

谢谢你的帮助。 祝你今天愉快!

/卢卡

您的代码可能存在的问题(除非您有错字):

  1. - (void) SetBFSV:(char)lbl ToVal:(long)BFSvl函数期望将char作为其第一个参数,但是将其传递给char *-您的第一个警告可能来自此处
  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. 如果使用alloc / init创建变量,则可能必须释放Strlbl变量,否则它将泄漏(但如果使用+ stringWithFormat,则不得释放它)

首先,您不能将对象用作参数:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM