可能重复:
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;
为什么数字是指针?
答案 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在运行时完成所有类兼容性工作。
希望这会有所帮助。有问题吗?
更新
没错:int
,float
,double
,char
,void
和指针组合都是C基元类型。您可以并且仍将使用这些,它们就是它们在C程序中的用途。但Objective-C添加id
类型作为弥合C的原始类型与Objective-C系统对象的高级类型之间的差距的方法。 id
本身被typedef为指向objc.h
中简单结构的指针。在编译器和语言本身的层面上,对类型的确没有太多意义。例如,你几乎从不声明一个id
的数组,当然不会对它们执行任何算术。
事实上,说Objective-C只是简单的vanilla C并带有一些额外的语法(特别是方法调用的方括号表示法),还有一些额外的原始类型({{1} },id
,IMP
)和一个大型运行时库。正是这个运行时库处理面向对象的所有事情。
无论如何,要回答你的问题,当你实际编程时,你最常(99%的时间)只使用类名来声明你的变量 - SEL
,NSString *
,{ {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的方式理解它。