Objective-C程序中的C风格太多?

Objective-C程序中的C风格太多?,objective-c,cocoa,Objective C,Cocoa,嗨,我写这个问题是因为我是ObjC的新手,在尝试制作我的First training应用程序时,我想到了很多疑问。问题是我有很强的C语言背景,去年我一直在用Java编程,我用Smalltalk做了一些拼贴工作(我之所以这样做是因为这些是我的编程参考,这些是我比较ObjC的语言) 我遇到的第一个问题是,我不知道在ObjC和C之间画一条线,例如,在处理数学运算时,我应该使用math.h还是像Smalltalk中那样有一种更“对象方式”(一个成员增加到:3)?一个完全没有C语言背景的人是如何学习Obj

嗨,我写这个问题是因为我是ObjC的新手,在尝试制作我的First training应用程序时,我想到了很多疑问。问题是我有很强的C语言背景,去年我一直在用Java编程,我用Smalltalk做了一些拼贴工作(我之所以这样做是因为这些是我的编程参考,这些是我比较ObjC的语言)

我遇到的第一个问题是,我不知道在ObjC和C之间画一条线,例如,在处理数学运算时,我应该使用math.h还是像Smalltalk中那样有一种更“对象方式”(一个成员增加到:3)?一个完全没有C语言背景的人是如何学习ObjC的

另一件我找不到的东西是一个集合的协议(我已经看过了苹果公司给出的基础框架文档)。因为我想实现一个expresion tree类,我想知道是否有所有集合都应该实现的方法(比如Smalltalk或Java),或者我必须亲自检查每个集合,看看我的新集合是否应该有一个很酷的方法

我不知道是我太笨了,还是我在搜索语言/框架没有的特性。我想用ObjC风格编程,而不是用C、Java或Smalltalk

对不起,问题太长了

绝对使用
。对于以30个周期运行的函数,您不需要支付消息发送开销。在这一点上,甚至函数调用开销似乎也相当大


更一般地说,尽可能多或少地使用C风格。我见过Objective-C,它只是一对用Objective-C消息粘在一起的C模块,我见过Objective-C,它基本上没有方括号,没有代码行。我看到过用两种方式编写的漂亮、有效的代码。好的代码就是好的代码,不管你怎么写它。

试着用每种语言来表达它的优点。依我看,这将包括Obj-C对象,但也包括类似C的代码实现方法。因此,请使用math.h和简明C代码来实现逻辑,但不要羞于使用Obj-C类将更大的功能块组织成有意义的东西


另外,尝试使用框架的样式与框架交互,这样您就不会在上游运行。

通常,您将使用C功能进行数值计算。您通常会将对象用于大多数其他事情。这是因为对象比一个简单的标量要重得多——这没有什么好处。当你可以只写
1+2
时,为什么还要写
[[NSNumber numberwhithinteger:1]numberByAddingNumber:[NSNumber numberwhithinteger:2]
?阅读不仅痛苦,而且速度慢得多,对你毫无益处

另一方面,Cocoa拥有丰富的字符串、数组、网络和许多其他领域的对象库,使用它们是一个巨大的胜利

知道那里有什么——从而知道做某事最简单的方法是什么——只是一个学习的问题。如果你认为那里应该有什么东西,但你找不到,你可以在这里或苹果的邮件列表上询问

至于收集协议,实际上没有。最接近它的是NSFastEnumeration协议,它精确地定义了一个方法:
countByEnumeratingWithState:objects:count:
。这允许您使用
for(id someObject in someCollection)
语法枚举集合中的对象。否则,所有集合都定义自己的独立接口

我遇到的第一个问题是,我不知道在ObjC和C之间画一条线

我的规则是在对你有意义的地方使用C。Objective-C的好处是让您可以选择什么时候是程序化的,什么时候是面向对象的。使用最适合您正在编写的代码的方法

另一件我找不到的事情是集合的协议[…]我想实现一个expresion tree类,我想知道是否有所有集合都应该实现的方法(比如Java),或者我必须手工检查每个集合,看看是否有我的集合应该拥有的方法

与Java不同,Objective-C没有像接口这样的集合主协议。此外,Java中的特定容器实现也没有激增。但是,这使您可以自由地以对代码有意义的方式实现集合

对于构建树状结构,您可以查看一下,看看利用它是否有用。(这可能比你需要或想要的更多,但可能值得一试。)


<> P.>至于你自己的集合,我在创建过程中学到了很多东西,欢迎你从代码中使用任何你喜欢的东西,或者只是看看我尝试创建类似可可的结构,设计来补充基础集合并类似地操作。祝你好运

如前所述,抽象集合类没有真正的协议(除了
NSFastEnumeration
协议,该协议在实现时为(集合中的id项)语法提供
),但有一些约定需要遵循

Apple对Cocoa编码指南的介绍涵盖了其中的一些内容,事实上,有一节介绍了命名收集方法,涵盖了一般情况(不过请注意,
NSArray
等通用容器类使用术语“Object”而不是“Element”在示例中列出–即
添加对象:
移除对象:
,等等)


当您希望您的类与KVC兼容时,遵循此处列出的模式(以及其他模式)实际上是至关重要的,因为KVC允许其他用户观察对象属性的更改。

ObjC是C的扩展,继续搜索您需要的,最终您会发现