15

我正在尝试用几个不同的部分制作一根弦。下面是我现在所拥有的。我的代码中没有任何错误,但是一旦我运行它并执行触发它的事件,我就会得到EXC_BAD_ACCESS。还有另一种方法可以将其NSInteger转换为NSString?

NSString *part1, *part2, *tempString;

NSInteger num1;
NSInteger num2;

part1=@"some";
part2=@"text";    

tempString = [NSString stringWithFormat:@"%@%@%@%@", 
              part1,
              (NSString *)num1, 
              part2, 
              (NSString *)num2];
4

7 回答 7

22

字符串和整数是根本不同的数据类型,在这种情况下,Objective-C 中的强制转换不会为您进行转换,它只会让编译器知道正在发生的事情(所以它会编译),但在运行时它会崩溃向上。

%d您可以使用代替将整数直接嵌入到格式字符串中%@

    tempString = [NSString stringWithFormat:@"%@%d%@%d", part1,num1, part2, num2];

NSInteger 只是常规“int”(数字)的一个花哨名称。NSString 是对字符串对象的对象引用。一些数字类型(整数和浮点数)可以像这样在 C 中直接在彼此之间进行某种转换,但这两者根本不能互操作。听起来您可能来自一种更宽容的语言?:)

于 2012-02-22T22:34:08.867 回答
18

Ben Zotto 于 2012 年 2 月 22 日 22:34 回答:

字符串和整数是根本不同的数据类型,在这种情况下,Objective-C 中的强制转换不会为您进行转换,它只会让编译器知道正在发生的事情(所以它会编译),但在运行时它会崩溃向上。

您可以使用 %d 而不是 %@ 将整数直接嵌入到格式字符串中:

tempString = [NSString stringWithFormat:@"%@%d%@%d", part1,num1, part2, num2];

NSInteger 只是常规“int”(数字)的一个花哨名称。NSString 是对字符串对象的对象引用。一些数字类型(整数和浮点数)可以像这样在 C 中直接在彼此之间进行某种转换,但这两者根本不能互操作。听起来您可能来自一种更宽容的语言?:)

"请记住,@"%d" 仅适用于 32 位。如果您曾经为 64 位平台编译过,则一旦开始使用 NSInteger 以实现兼容性,您应该使用 @"%ld" 作为格式说明符。" 马克·夏博诺

所以,解决方案:

tempString = [NSString stringWithFormat:@"%@%ld%@%ld", part1, (long)num1, part2, (long)num2];

来源:Cocoa 字符串编程指南 - 字符串格式说明符(需要 iPhone 开发者注册)

于 2013-01-15T13:07:05.347 回答
1

你必须使用%d整数而不是%@

所以,[NSString stringWithFormat:@"%@%d%@%d", part1,num1, part2, num2];是格式化字符串的正确代码。

希望能帮助到你。

于 2012-02-22T22:35:04.633 回答
0
NSString* tempString = [NSString stringWithFormat:@"%@%d%d", part1, num1, num2];
于 2012-02-22T22:34:12.637 回答
0

尝试以下操作:

 tempString = [NSString stringWithFormat:@"%@%d%@%d", part1,(NSString *)num1, part2, (NSString *)num2];
于 2012-02-22T22:34:38.173 回答
0

NSIntegers 是实际整数 - 不是NSObject派生对象。尝试:

tempString = [NSString stringWithFormat:@"%@%d%@%d", part1, num1, part2, num2];

试图强行NSInteger进入的演员NSString*也很危险,并且可能是您坠机的实际来源。编译器让你侥幸逃脱,因为它相信你知道你在用这种类型的转换语句做什么。

于 2012-02-22T22:35:11.813 回答
0
NSString *part1, *part2, *tempString;

NSInteger num1;
NSInteger num2;

part1=@"some";
part2=@"text";

tempString = [NSString stringWithFormat:@"%@%d%@%d", part1,num1, part2, num2];
NSLog(@"%@",tempString);
于 2013-11-06T10:12:30.653 回答