【问题标题】:Why is it a pointer? [duplicate]为什么是指针? [复制]
【发布时间】:2012-03-27 07:14:27
【问题描述】:

可能重复:
objective c difference between id and void *
why most of the objects we create in iphone are pointers

根据斯坦福大学课程,2010/2011

第三讲

那家伙在那里做了一些奇怪的事情(至少对我来说),就是这样

NSString *digit = sender.titlelabel.text;

为什么数字是指针?

【问题讨论】:

标签: objective-c


【解决方案1】:

NSString 是一个 Objective-C 类,Objective-C 中的所有对象引用都是指针。我建议阅读一些文档,例如 Learning Objective-C A Primer:

注意第一个声明中的 *。在 Objective-C 中,对象 引用是指针。如果这对您来说不完全有意义, 不用担心——您不必成为有指针的专家也能 开始使用 Objective-C 编程。你只需要记住把 强类型对象的变量名前面的 * 声明。 id 类型意味着一个指针。

【讨论】:

  • 阅读阅读阅读...我喜欢阅读,但大多数东西只是页面和页面,你找不到包含你答案的单行无论如何,这解决了我。我得出的结论是 NSString 总是指针。顺便说一句,还有哪些其他对象总是指针?编辑:看到乔希的回答后,我找到了。谢谢:)
  • 我从我发布的链接中添加了一个引用。在 Objective-C 中,唯一需要成为指针的是对类的引用(类的实例)。因此,可以在没有指针的情况下声明 int、double 甚至 struct 等原始类型。此外,如果您要混合 C++ 和 Objective-C,C++ 类仍然可以在堆栈上声明(无指针)。
  • 不,NSString 并不总是指针。一个引用通常通过指针。
  • 啊...他不想“创建”一个名为 digit 的 NSString 来将文本放在那里吗?他为什么把它当成指针?
  • @joe 是的,有一个比赛条件,我忘记发表评论了。
【解决方案2】:

这不是数字,而是标签中的“文本”,它(我猜)是一串整数,用于表示时间。

因此,所有 NSString 类型在 Obj-c 中都被声明为指针。

 sender.titlelabel.text;

返回一个 NSString *

记住,它与以下内容相同:

NSString *str  = [sender.titlelabel getText]; 

【讨论】:

    【解决方案3】:

    你可以找到一个有趣的关于为什么它必须是一个指针:

    NSString and Pointers

    我希望它能帮助您以 Objective-C 的方式理解它。

    【讨论】:

      【解决方案4】:

      因为text 也是。或者更准确地说,因为getText 消息返回一个指针。

      【讨论】:

      • 您确定这一点吗?我想这是最清楚和最有说服力的答案,getText 返回一个指针:/
      • 虽然匹配返回类型确实如此,但它比这更深入。当你声明一个对 Objective-C 类的引用时,它总是被声明为一个指针。
      • @Joe 虽然您是对的,但还有比这更深入的内容。一个可以构造一个 ObjC 对象(作为一个堆栈对象)并像结构一样引用它。然而,这不是通常的做法。相反,让它的类构造那个(匿名)对象;并且该类返回一个指针。
      【解决方案5】:

      digit 的类型是id,它基本上只是一个指向某个结构的 C 指针。在Objective-C 中对对象的所有 引用都具有这种原始类型,而与对象的类无关。因此,很遗憾,您的问题的答案是,因为这就是 Objective-C 的工作方式

      因此,无论您是声明NSString*UITableViewController* 还是MyClass*,您的变量都具有id 类型。这是该语言实现多态性的主要方式。因此,例如,以下声明是等价的:

      NSString *digit;
      id digit;
      

      方法原型也是如此。这些是等价的:

      -(UITableViewCell *)tableView:(UITableView)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
      -(id)tableView:(id)tableView cellForRowAtIndexPath:(id)indexPath;
      

      id 类型的变量本身不是对象,它是指向对象的指针。它是您操纵对象的句柄。 Objective-C 在运行时完成所有的类兼容性工作。

      希望这会有所帮助。有什么问题吗?

      更新

      没错:intfloatdoublecharvoid 以及指针组合,都是 C 原始类型。您可以并且仍然会大量使用它们,它们就是它们在 C 程序中的样子。但是,Objective-C 添加了id 类型,作为弥合C 的原始类型和Objective-C 系统的非常高级的对象类型之间的差距的一种方式。 id 本身是类型定义为指向objc.h 中的简单结构的指针。在编译器和语言本身的级别上,类型确实没有太多意义。例如,您几乎永远不会声明 ids 的数组,当然也永远不会对它们执行任何算术运算。

      事实上,毫不夸张地说,Objective-C 只是普通的 C 语言,添加了一些语法(特别是用于方法调用的方括号符号)和一些额外的原始类型(idIMPSEL) 和一个大型运行时库。正是这个运行时库处理所有面向对象的事情。

      无论如何,为了回答您的问题,当您实际编程时,您通常(99% 的时间)只使用类名来声明您的变量 - NSString *NSData *UITableViewController * 和很快。如果您编写的代码明显试图将NSString* 放在预期NSData* 的位置,编译器会知道您在说什么,并发出警告。但这些类型的实际含义只存在于运行时。

      我离题了一点,但我不确定你的理解在哪里让你失望,所以我想我只是解释一下。您可能需要阅读 Apple 的 The Objective-C Programming Language 以了解该语言。

      【讨论】:

      • 但是有些东西是这样声明的 int X float YI 知道这些是 C 的东西(我实际上是 C/C++ 中级~专业算法程序员),所以只有 Objective-C 对象使用这种方式或什么?
      • 检查这个:stackoverflow.com/questions/2189212/… 我发现了同样的问题。但由于它使用指针,所有其他对象都可以访问所有对象。它只适用于内存。它对它所属的一切视而不见,没有什么可以阻止它。对吗?
      • 没错,有点。是编译器对OO视而不见。 Objective-C 有两个级别的类型——原始的和面向对象的。原始类型 - 来自 C 的 int、float 等 - 以及 Obj-C 对 id、SEL、IMP 的添加 - 是原始类型并由编译器强制执行。 OO 类型系统 - 全部 - NSString 等,以 NSObject 为根 - 是 OO 类型,但 OO 语义(封装、多态等)由运行时系统强制执行。编译器发现明显的 OO 类型冲突,但这些只会导致警告,而不是错误。阅读文档,我没有字符了!
      猜你喜欢
      • 2010-09-14
      • 2016-03-13
      • 1970-01-01
      • 1970-01-01
      • 2016-09-25
      • 2018-10-11
      • 2023-04-02
      • 2013-06-27
      • 2014-06-25
      相关资源
      最近更新 更多