[英]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传递了错误,但是我不明白是什么。
谢谢你的帮助。 祝你今天愉快!
/卢卡
您的代码可能存在的问题(除非您有错字):
- (void) SetBFSV:(char)lbl ToVal:(long)BFSvl
函数期望将char作为其第一个参数,但是将其传递给char *-您的第一个警告可能来自此处 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
,因此会崩溃
如果将char传递给函数,则正确的格式说明符将为%c,而不是%s
首先,您不能将对象用作参数:
(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.