【问题标题】:When to write "NSString *str" or "NSString str"?什么时候写“NSString *str”或“NSString str”?
【发布时间】:2023-05-25 15:47:01
【问题描述】:

我正在学习 Objective C 在 iOS 上编程。 我知道这与我无法理解的指针有关。 我不知道创建这样的字符串(或任何NSObject)有什么区别:

NSString place = ...;
or
NSString *place = ...;

感谢您的帮助!

【问题讨论】:

  • 你需要了解指针。停止你正在做的事情并阅读this

标签: iphone objective-c ios cocoa-touch pointers


【解决方案1】:

从不NSString str。时期。所有 Obj-C 对象实际上都是 C 指针。

【讨论】:

  • 这是对的,但是也有很多以“NS”开头的类型名不是NSObjects。如果它在 Cocoa 文档中被列为 typedef,例如 NSRectNSUInteger,您可能不需要使用指针。
【解决方案2】:

NSString 是一个类,因此声明为NSString *str 的类的实例必须始终声明为指针(因为对象实例只能通过指向对象结构的指针访问)。因此这个声明是非法的:NSString str

【讨论】:

    【解决方案3】:

    Objective-C 在某种意义上更像是一种脚本语言。类定义在运行时维护并且可以修改。 objc.h 中有一个类定义系统的 C 接口。甚至系统类也可以修改,尽管这样做不是一个好主意。因此,所有 Objective-C 对象都必须在运行时创建并通过指针访问。换句话说,编译器无法知道对象在编译时应该是什么样子。这也是为什么“对象可能不响应选择器”是警告,而不是错误并且其中包含“可能”一词的原因。

    【讨论】: