为什么它是一个指针?

时间:2012-03-09 20:49:01

标签: objective-c

  

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

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

第3讲

这家伙在那里做了一些奇怪的事(至少对我而言),就是那个

NSString *digit = sender.titlelabel.text;

为什么数字是指针?

5 个答案:

答案 0 :(得分:2)

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本身被typedef为指向objc.h中简单结构的指针。在编译器和语言本身的层面上,对类型的确没有太多意义。例如,你几乎从不声明一个id的数组,当然不会对它们执行任何算术。

事实上,说Objective-C只是简单的vanilla C并带有一些额外的语法(特别是方法调用的方括号表示法),还有一些额外的原始类型({{1} },idIMP)和一个大型运行时库。正是这个运行时库处理面向对象的所有事情。

无论如何,要回答你的问题,当你实际编程时,你最常(99%的时间)只使用类名来声明你的变量 - SELNSString *,{ {1}},等等。编译器会知道你在说什么,并且如果编写的代码明确地试图将NSData *置于预期的UITableViewController *,则发出警告。但这些类型的实际含义实际上只存在于运行时。

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

答案 1 :(得分:1)

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

  

注意第一个声明中的*。在Objective-C中,对象   引用是指针。如果这对你没有任何意义,   不要担心 - 你不必成为能够指出的专家   用Objective-C开始编程。你只需记得放   强类型对象的变量名前面的*   声明。 id类型意味着一个指针。

答案 2 :(得分:1)

这不是一个数字,它是来自标签的“文本”,它是(我猜)一串整数等表达时间。

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

 sender.titlelabel.text;

返回NSString *

请记住,它与:

相同
NSString *str  = [sender.titlelabel getText]; 

答案 3 :(得分:1)

因为text也是如此。或者更重要的是,因为getText消息返回指针。

答案 4 :(得分:0)

你可以找到一个有趣的原因,它必须是一个指针:

NSString and Pointers

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