【问题标题】:Objective C - Cast operator int to nsstringObjective C - 将运算符 int 转换为 nsstring
【发布时间】:2012-05-13 17:11:03
【问题描述】:

这是目标 c 中强制转换运算符的正确用法:

//casting an int to float
int a = 1;
float b = (float) a;

为什么我不能使用以下内容将 int 转换为 nsstring:

int a = 1;
NSString *c = (NSString *)a; 

//I receive the error : "cast of 'int' to 'nsstring' is disallowed with ARC"

执行上述操作在概念上有什么问题?

附:我已经知道我应该使用 "c= [NSString stringWithFormat:@"%i",a];"!

【问题讨论】:

  • 只是编译器支持或提供的方式/语法。

标签: objective-c casting nsstring int


【解决方案1】:

你不能这样做:

int a = 1;
NSString *c = (NSString*)a;

因为您正在创建一个指向内存地址 0x1 的 NSString 指针。当您尝试使用(“取消引用”)NSString 指针 c 时,您正在尝试访问不属于您的内存并且会出现 segmentation fault

编辑:
Obligatory link to a good article on pointer basics.

【讨论】:

  • 此外,ARC 在这一点上会导致编译器错误,因为它不了解如何处理看到指向原始值的指针,然后突然被告知它实际上是指向对象的指针。 AKA ARC 不知道它是否可以对其调用保留/释放,或者它是否甚至需要跟踪它。如果没有 ARC,您的代码可以正常编译,但是由于上述原因,您会崩溃。
  • @inspector-g 你能解释一下吗..我不清楚 =)
  • 了解指针基础知识以及对象和指向对象的指针之间的区别至关重要。如果您还没有阅读该链接,那么您真的应该阅读。 NSString* c 将指向(或引用)一个包含NSString 对象的内存地址。当您使用变量c 时,内存地址需要dereferenced 才能访问真正的NSString 对象。将c 设置为(NSString*)a,其中a 为1,导致c 指向内存地址0x1。问题是你从来没有将NSString 放在内存地址0x1 上,更糟糕的是你没有“拥有”实际上在0x1 上的任何东西!
  • 试图取消引用 0x1 的内容会导致崩溃,并且编译器基本上是友好的并试图阻止你犯这个错误(@JackLawrence 提到过)。在 Objective-C 中创建对象的唯一方法是使用 allocinit 范例(或者像 NSString stringWithFormat: 这样的助手,它们只是在下面做一些 allocinit 的东西)。将int 转换为NSString* 将不起作用,因为它不会导致编译器使用allocinit 范例,或者像NSString stringWithFormat: 这样的帮助程序。相反,你只是指出记忆不好。
猜你喜欢
  • 2011-01-24
  • 2012-10-06
  • 2011-12-04
  • 1970-01-01
  • 2011-09-18
  • 2020-10-26
  • 2016-12-17
  • 2014-10-25
  • 2010-12-22
相关资源
最近更新 更多