【问题标题】:Why does an object variable have to be a pointer?为什么对象变量必须是指针?
【发布时间】:2012-05-28 10:25:50
【问题描述】:

如果我声明NSMutableString

NSMutableString *str_value;

为什么我必须将其声明为指针(使用*)?否则,我会收到编译错误。

有人能解释清楚吗?

【问题讨论】:

  • 对不起,什么是“coco”?我打算将其更正为“Cocoa”,但这没有意义,因为NSMutableString str_value; 是 Cocoa 中的错误(您只能声明指向 Objective-C 对象的指针)。
  • 强烈建议不要在 SO 上使用 IRC 英语。

标签: objective-c pointers compiler-errors


【解决方案1】:

回想一下,Objective C 是 C 的 超集。当您在 C 中声明一个没有 * 的变量时,这表明该变量的内存是在自动存储中分配的,如果它是一个局部变量,如果它是结构的成员,则作为其外部结构的一部分,或者如果它是静态或全局变量,则在静态内存中。在函数的参数列表中使用不带*的类型名或结构标记表示按值传递。

Objective C 语言的设计者本可以走类似 Java 的路线,让每个类实例都是一个没有指针语法的指针,但是 Objective C 程序的读者需要知道名称是否代表 typedef基于 structid 类型来回答关于该类型对象的最基本问题,例如它是通过指针还是通过值隐式传递,如果它是作为拥有结构的一部分分配的,还是作为由结构内的指针指向的堆对象,依此类推。

为了避免这种混淆,Objective C 的设计者决定保留 id 对象的显式指针语法。

【讨论】:

    【解决方案2】:

    指针表示您正在指向/引用该类。是的,它会导致编译错误,指针的原因主要是为了内存。一种数据类型(int 或 BOOL 或 float 等)只有几个字节,因此不需要指针。但是 NSMutableString 和其他 Objective-C 类的属性和方法很多,代码也很多。因此,因为在您的应用程序中会有很多对象,这将使用大量内存,从而减慢您的应用程序/降低性能。当然,一旦你有了一个指针,你就应该释放这个对象。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-10-30
      • 1970-01-01
      • 2016-11-08
      • 1970-01-01
      • 1970-01-01
      • 2011-06-30
      相关资源
      最近更新 更多