当前位置: 首页 > 科技观察

为什么Objective-C难学?

时间:2023-03-12 07:45:48 科技观察

作为网络上活跃的Objective-C开发人员,我收到了很多关于Objective-C的问题。当人们学习Objective-C或尝试开发应用程序时,这些问题会不断出现,其中一些可能是笼统的,例如“Objective-C似乎太难了”,也可能是诸如“那是什么'-'?”之类的详细问题。用过吗?”。我想说的是,这些其实都是很好的问题,那么接下来我就来和大家一起探讨一下:为什么有些程序员害怕转iOS或者OSX开发,而不是Ruby或者Java。语法我来说说关于什么是编程语言,所谓编程语言就是人们可以阅读和理解的程序代码。编程语言通常包括一系列内容:语法(编写和声明语句的规则)和语义(有效组合的语句和语句来实现某些任务)。大多数(通常)编程语言具有类C风格的方法调用,并且访问类成员使用.语法。(也称为C中的结构)。虽然这些语言通常都有自己定义类的方式(Java和C#或C++不太一样),语言的很多细节还是很相似的。每当人们开始使用一种新的编程语言时,如果它是句法l看起来很熟悉。像大多数人都有C语法背景,所以如果你想学习一门有C语法的语言,你的第一印象会很友好。从语法的角度来看,Objective-C是**独一无二的**。它的语法太特殊了。由于它的另类语法,很多人没有耐心去深究它的语义,而它的语义与C++、Java等语言如出一辙。Python和Ruby等所谓的“怪异”语言更容易上手,因为它们可以使用.进行方法调用和访问类成员的语法。人们通常会很快习惯使用缩进而不是花括号。当我向其他人介绍Objective-C时,我通常将它比作一种OOP(面向对象编程)语言。到目前为止没问题。也许他们以前知道lisp,所以理解语法并不难。在这一点上,人们普遍难以接受,情况已经变得不那么乐观了。这句话能直接让人崩溃。那些冒号是什么?太可怕了!那么一堆问题就来了:方法是怎么调用的?是通过performAction还是其他方式?如何重载该方法?要知道,我们不是在讨论方法,我们是在讨论消息(我不会讨论它们之间的区别)和选择器,比如上面介绍的performAction:withTwoParameters。不过,大家也懒得去了解了。Objective-C是C的超集,它其实是一种非常酷的编程语言,但是由于自身的一些特点,与其他现代编程语言相比,人们会认为Objective-C很古老。Objectivec-C作为C的超集,在C的基础上扩展了一系列非常规的特性,恰恰增加了Objective-C的复杂度。Objective-C是一种大型语言。这个定义的出发点是它的语法非常复杂。事实上,Apple已经在加大对Objective-C的瘦身力度。比如虽然速度慢,但总算完成了从头文件到标准C风格的过渡。而且,Apple还对Objective-C进行了很多改进,并添加了许多新特性,使Objective-C的代码更加简洁,例如:SynthesizingpropertiesAccessgetters/settersthrough。语法垃圾收集(GarbageCollection)块(closurescloses)ARC(AutomaticReferenceCounting)弱引用(Weakreferences)因此,尽管语言变得越来越庞大,但开发和编写代码的复杂度却降低了。RuntimeObjective-C是动态运行的,这个特性从它与C的渊源来看可能不是那么直观。由于不需要直接写汇编代码,C语言本身就是一种变化不大的语言。鉴于Objective-C是C的超集,我们很容易倾向于Objective-C对C的稳定性,但实际上Objective-C-C是一门动态运行的语言,相当灵活。Objective-C支持函数柯里化(functioncurrying),支持反射机制,可以在运行时为类动态添加或移除方法。除非你接触过类似Objectivec-C特性的编程语言,比如Ruby或者Lisp,否则一时半会很难适应Objective-C。但不用担心!有些事情,表面上看起来神秘可怕,其实并没有那么复杂。Framework使用Objective-C构建应用程序完全离不开Cocoa/CocoaTouch框架。就好像使用Ruby开发Web应用程序离不开Rails一样。经过多年的发展,Cocoa已经变得很稠了。然而,如前所述,Apple最近逐渐降低了常规iOS开发所依赖的CocoaTouch框架的复杂性。尽管如此,即使要开发的app极其简单,但要学习的东西还是很多的,比如苹果的官方文档和已经曝光的各种头文件都是很好的学习资源。以UIView中的contentStretch属性为例。头文件的定义和说明如下:@property(nonatomic)CGRectcontentStretch__OSX_AVAILABLE_STARTING(__MAC_NA,__IPHONE_3_0);//animatable.defaultisunitrectangle{{0,0}{1,1}}这到底是做什么的意思是?按照我的理解,这个属性是用来描述可伸缩区域的大小的。但是怎么办?这个区域是指矩形吗?也许你永远不会和这个属性打交道,但如果在开发过程中的某个时刻、某个场景中使用这个属性可以轻松解决你的问题,你会在那个时候知道它的存在并正确使用它吗??Cocoa/Cocoa-Touch是巨大的框架。要真正驾驭它只能靠熟能生巧。但是这个熟悉它的过程往往让很多新手望而生畏。历史长期以来,Apple一直在不断推动Objective-C语言开发体系的进步,例如Objective-C运行时、Cocoa/CocoaTouch框架,以及一系列针对Objective-C编译器的更高层次的设计交叉.这种重叠使得Objective-C不仅仅是一种语言。所以在学习Objective-C的时候,不能孤立地学习这门语言、某些框架、它的运行机制或者编译器,而是要将它们融会贯通。例如,Objective-C中集成的ARC(AutomaticReferenceCounting)机制,现在涉及语义(无需显式调用dealloc)、编译器级别(显而易见)以及Cocoa/CocoaTouch框架的命名约定。上面提到的围绕Objective-C的一系列紧密相关的设计是它的独特之处。其他语言或多或少都依赖于其他语言或平台来运行,比如运行在.net上的IronPython,不是Java而是依赖JVM的Clojure,甚至Ruby和Rails其实都有自己相对独立的实体和项目。Cocoa/CocoaTouch和Objective-Cruntime支持的唯一比较知名的MacRuby,后来被Apple叫停,随后支持。Objective-C和相关框架、运行时、编译器等。该系统几乎对其他开发人员社区关闭。未来从目前掌握的信息来看,苹果在过去四年中一直在努力降低Objective-C语言的复杂性。取消手动内存管理和C标准头文件,引入更符合当前编程语言趋势的ARC机制,以及通过.语法都是为了降低Objective-C的学习成本。但即便如此,Objective-C仍然是一门具有一定学习门槛的开发语言,它的火爆完全是基于Objective-C编写的流行iOS应用带来的。