我正在尝试用几个不同的部分制作一个字符串。以下就是我现在所拥有的。我的代码中没有任何错误,但是一旦我运行它并执行触发它的事件我得到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];
答案 0 :(得分:20)
字符串和整数基本上是不同的数据类型,在这种情况下,Objective-C中的转换不会为你做转换,它只会让编译器知道发生了什么(所以它编译)但是在运行时它会爆炸。
您可以使用%d
代替%@
将整数直接嵌入到格式字符串中:
tempString = [NSString stringWithFormat:@"%@%d%@%d", part1,num1, part2, num2];
NSInteger只是常规“int”(数字)的奇特名称。 NSString是对字符串对象的对象引用。一些数字类型(int和浮点)可以像这样直接在C中相互转换,但这两者根本不可互操作。听起来你可能会来自一种更宽松的语言? :)
答案 1 :(得分:17)
于12月22日22:34回答,Ben Zotto:
字符串和整数是根本不同的数据类型,和 在这种情况下,在Objective-C中进行转换不会为你做转换, 这只会让编译器对发生的事情撒谎(所以编译) 但是在运行时它会爆炸。
您可以使用%d将整数直接嵌入到格式字符串中 而不是%@:
tempString = [NSString stringWithFormat:@"%@%d%@%d", part1,num1, part2, num2];
NSInteger只是常规“int”的奇特名称 (数)。 NSString是对字符串对象的对象引用。一些 数字类型(int和浮点)可以进行转换 彼此之间直接在C这样,但这两个不是 完全可以互操作。听起来你可能会来自更多 宽容的语言? :)
“请记住,@”%d“只能在32位上运行。如果您为64位平台编译,一旦开始使用NSInteger兼容性,您应该使用@”%ld“作为格式说明符。 “ by Marc Charbonneau
所以,解决方案:
tempString = [NSString stringWithFormat:@"%@%ld%@%ld", part1, (long)num1, part2, (long)num2];
来源:String Programming Guide for Cocoa - String Format Specifiers(需要iPhone开发人员注册)
答案 2 :(得分:1)
您必须使用%d
表示整数,而不是%@
。
因此,[NSString stringWithFormat:@"%@%d%@%d", part1,num1, part2, num2];
是格式化字符串的正确代码。
希望它有所帮助。
答案 3 :(得分:0)
NSString* tempString = [NSString stringWithFormat:@"%@%d%d", part1, num1, num2];
答案 4 :(得分:0)
尝试以下方法:
tempString = [NSString stringWithFormat:@"%@%d%@%d", part1,(NSString *)num1, part2, (NSString *)num2];
答案 5 :(得分:0)
NSInteger
是实际整数 - 而不是NSObject
- 派生对象。尝试:
tempString = [NSString stringWithFormat:@"%@%d%@%d", part1, num1, part2, num2];
试图强迫NSInteger
进入NSString*
的演员阵容也很危险,可能是你坠机的实际来源。编译器让你逃脱它,因为它相信你知道你正在用这种演员声明做什么。
答案 6 :(得分:0)
NSString *part1, *part2, *tempString;
NSInteger num1;
NSInteger num2;
part1=@"some";
part2=@"text";
tempString = [NSString stringWithFormat:@"%@%d%@%d", part1,num1, part2, num2];
NSLog(@"%@",tempString);