为什么OC语言很难

作为一个Objective-C的coder,我总能听到一部分人在这门语言上抱怨有很多问题。他们总在想快速学习这门语言来写一个App出来,但他们也总是联想到Objective-C看上去实在太难了或者在想这些语法符号都是神马玩意?不错,他们问得非常好,所以本人也解释一下为什么很多程序员相比较学习Ruby或者Java很容易,但在决定开发iOS或者OS X应用时会那么犹豫。 

语法: 
首先我们谈谈神马叫做编程语言,编程语言是一种让人们能读懂并且能够展现程序的执行行为的语言,包括语法(正确的表达式以及状态机的使用规则)以及语义(如何去组织这些表达式以及状态机以一种有意义的方式去完成我们的目标) 

大部分编程语言都是基于C语法风格的,也就是我们常说的点语法,依靠小数点符号来调用方法或者获取类的成员(当然了,在C语言中类被替代为结构体)。它们通常都是自己实现类的定义(注意在这里Java与C#和C++有稍微一点不一样),但无论如何这些语言的具体细节都是一样的。当我们接触一个新的编程语言时,我们当然很乐意看到新语言的语法是我们似曾相识的。毕竟大部分程序员都了解C语言的语法。 

然而Objective-C压根就不是C语法风格的编程语言。它与我们熟悉的语言语法区别太大以至于大部分程序员根本看不懂这些Objective-C代码是神马东西。 

甚至其他一些像Python或者Ruby这样的“奇怪”的语言都能让人看个大概出来,毕竟Python与Ruby至少还是点语法风格的,使用点语法来调用方法以及获取类的成员。相反它们缺乏分支结构并不会长时间影响程序员的理解,毕竟这两种语言也有自己的方式来完成同样的目标。 

下面我们来介绍一下Objective-C语言: 这里我会拿另一个OOP语言来与它进行比较 
 

我想这里大家肯定还不会有什么问题,来看看这个: 
 

好了好了,我想肯定有部分人想问一大堆问题了。但这还不是最糟糕的,我们接着来看一个更强悍的: 
 

一般到了这里,我想大家都头都大了几圈。 

这到底是个神马情形?这么多分号!太恐怖了!接着会冒出一大堆问题:这到底调用的是神马方法?又是怎么调用的?是performAction吗还是别的东西?方法重载该如何做?哦,我的天! 

最好先忘了我们熟悉的方法调用。实际上,当你看到performAction:withTwoParameters:时,我们其实在谈论消息而不是方法。当你能这么理解时问题就好办多了。 

实际上Objective-C是很严格的C语言的超集。而与流行的编程语言风格又差距太大。作为C语言的超集,它增加了很多东西,我们将简单看看它到底增加了什么复杂的东西。 

Objective-C是一个很“大”的语言,我是说它的语法很复杂而且又具备弹性。Apple公司已经尽可能减小了Objective-C语言的体积,然而,他们还是添加了一些东西来让Objecive-C表达式更加简单。 
Synthesizing properties 
Dot-syntax for accessing getters/setters 
Garbage Collection 
Blocks (closures) 
Automatic Reference Counting 
Weak references 

所以虽然这个语言越来越大了,但是在表达同样的目的使用的代码却越来越简单。 

运行时: 
Objective-C的运行时是动态的,它能让你在运行时为类添加方法或者去除方法以及使用反射。 
除非你用过像Ruby或者Lisp这类支持这种特性的语言,否则你会感觉很怪异。但请放心!在你尝试使用一些好的新特性时一开始都是很郁闷的。 

框架: 
如果离开了Cocoa/Cocoa Touch框架,那么Objective-C简直没法创建App。就如同Ruby离开了Rails就没法创建Web应用程序一样。 
Cocoa既大又老。比如看看UIView的contentStretch属性,整个头文件就这么点东西: 

?
1
@property(nonatomic) CGRect contentStretch __OSX_AVAILABLE_STARTING(__MAC_NA,__IPHONE_3_0); // animatable. default is unit rectangle {{0,0} {1,1}}

就这么多?首先我假定它定义了一个可拉伸的内容区域,但是这是如何做到的?矩形单元又在哪里?Cocoa/Cocoa-Touch是解释这个的唯一途径,作为Objective-C的新人,你可以去咨询它。 

历史: 
纵向看来,Apple公司领导着Objective-C语言的发展与维护,包括Objective-C运行时,Cocoa/Cocoa-Touch框架以及Objective-C语言的编译器。看上去Objective-C就如同以下一个云状图: 
 

当你去学习Objective-C时,它不仅仅就是一个框架,一个运行时或者一个编译器;而是它们全部。还有个很重要的部件就是 Automatic Reference Counting(使用后无法直接调用dealloc方法),这玩意会让你使用Cocoa/Cocoa-Touch编程时更加方便。 


紧密耦合系统代码设计是Objective-C独有的。其他语言比如在.Net框架下运行的Iron Python。以及一大堆运行在JVM的非Java语言,比如Clojure。甚至Ruby以及Rails都是两个不同的项目。当你打算使用其他语言配合Cocoa/Cocoa-Touch以及Objective-C运行时时。你唯一的选择就是Mac Ruby。 

未来 : 

这4年来,我们可以看到Apple公司已经尽可能的减小了Objective-C语言的大小以及复杂度。他们也完成了手动内存自动管理以及经典C头文件的方式;而且开始慢慢对属性存取器引入点语法以及Automatic Reference Counting来方便程序员编程。但就现在看来,Objective-C还是比较难接触与学习的;之所以现在变得越来越流行唯一的原因就是它是做iOS app的唯一途径了。

转载于:https://www.cnblogs.com/psp429504257/p/4572224.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/431695.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

小狐狸ChatGPT付费创作系统小程序端开发工具提示打开显示无法打开页面解决办法

最新版2.6.7版下载:https://download.csdn.net/download/mo3408/88656497 很多会员在上传小程序前端时经常出现首页无法打开的情况,错误提示无法打开该页面,不支持打开,这种问题其实就是权限问题,页面是通过调用web-v…

http status 404 – 未找到_从零开始搭建自己的网站004添加404处理页面

在将web-war上传到服务器并重启tomcat后,发现找不到login页面目录结构:add exception do wth page2.添加页面内容;到w404.jsp异常处理,404首页 Home (current) Link Dropdown Action Another action Disabled Search 百度百科&am…

dw怎么打开html模板,Dreamweaver中如何使用模板

随着Internet的普及,很多人已经不满足于仅仅上网冲浪,而希望深入地参与其中。现在,拥有自己的Web网站已经成为一种潮流。虽然制作一个简单的网页并不困难,但是制作出超凡脱俗的网站就不那么容易了。下面是小编为大家带来的关于Dre…

云计算的认识和看法_云存储已经成为存储的未来,你的存储跟上节奏了吗?

云计算是目前业界最关注的话题,其实云计算让很多人云里雾里。而云存储则是存储的未来。云存储这个概念的出现,在一定程度上改变了我们对于传统存储模式的看法。但是云存储想必让很多人迷惑,今天我们就来聊聊云存储的那些事儿。对于一些计算机…

coco2dx c++ HTTP实现

coco2dx c HTTP实现 达到的结果如下面的 iPhone截图 android 日志截图 流程图例如以下 功能主要通过CURL c pthread 实现 我实现的不是多线程断点(假设要实现能够依据我这个进行加入任务序列,可參考 cocos2d-x 中AssetsManager的实现,事实上…

计算机动画 应用,计算机动画与应用.PDF

计算机动画与应用.PDF三维计算机动画金小刚Email: jin浙江大学CAD&CG 国家重点实验室紫金港校区蒙民伟楼512Course web: /home/jin/animation.htmXiaogang Jin 1 2/28/2017ModelingRenderingAnimation计算机图形 User Interface虚拟世界Xiaogang Jin 2 2/28/2017Pixar片头X…

idea怎么使用断点调试js_idea怎么使用断点调试js

{"moduleinfo":{"card_count":[{"count_phone":1,"count":1}],"search_count":[{"count_phone":10,"count":10}]},"card":[{"des":"刷脸门禁通行系统前端接入人脸AI赋能的人脸…

常量池在堆还是方法区_第九章_方法区

方法区栈、堆、方法区的交互关系这次所讲述的是运行时数据区的最后一个部分——方法区从线程共享与否的角度来看ThreadLocal:如何保证多个线程在并发环境下的安全性?典型应用就是数据库连接管理,以及会话管理栈、堆、方法区的交互关系下面就涉…

html5表单密码验证及提示,HTML5表单及其验证(示例代码)

1.输入型控件Input type用途说明email电子邮件地址文本框url网页URL文本框number数值的输入域属性 值 描述max number 规定允许的最大值min number 规定允许的最小值step number 规定合法的数字间隔(如果 step"3",则合法的数是 -3,0,3,6 等)value number …

3.6.4python下载安装教程_python 3.6.4安装教程

{"moduleinfo":{"card_count":[{"count_phone":1,"count":1}],"search_count":[{"count_phone":4,"count":4}]},"card":[{"des":"阿里技术人对外发布原创技术内容的最大平台&…

CTabCtrl控件标签的相关设置

原文链接: http://blog.csdn.net/happyhell/article/details/6012177 1、 获得CTabCtrl标签高度:CRect rc; CTabCtrl *pTabCtrl GetTabControl(); pTabCtrl->GetItemRect(&rc); int nHeight rc.Height(); 2、修改CTabCtrl标签上的文字: // In t…

python人工智能原理及其应用_人工智能原理与实践:基于Python语言和TensorFlow

基 础 篇 第1章 绪论 1 1.1 人工智能简介 1 1.1.1 人工智能的概念 1 1.1.2 现代人工智能的兴起 5 1.1.3 人工智能的学术流派 5 1.2 人工智能的发展历史 8 1&#xff0…

html a 点击防止刷新,a标签点击跳转页面不刷新的问题

作为一位前端新手,刚接触移动端开发不久,遇到的问题真的是一个接着一个...前面写好了几个页面,今天试着将各个页面的链接打通,然后问题就来了...(╯︵╰)这里看一下原来想要实现的两个页面跳转的效果--点击图一标注的栏目可以跳转到一个新的页面图二...按照之前写a标签的跳转链…

不显示表头_技术干货 | 基于数模混合型SoC实现的两线制高精度无源表头方案

摘要:针对传统的两线制表头在高低温环境下测量精度差、温漂大的特点,现提出一种可满足高低温环境使用需求的两线制高精度数显表头设计方案,此方案在高低温环境下测量精度高、工作稳定、抗干扰能力强。引言随着仪表技术和低功耗技术的发展&…

python gui开发_python 开发GUI应用之Dabo

这几天在研究用python开发GUI应用程序,首先选择了wxpython,英文书籍wxpython in action是不错的,网上也有中文版。 在win7下安装python2.7,wxpython2.8.12.1,来个HelloWorld,照着教程一点不成问题。 我为了能够快速开发…

maven2-snapshot快照库和release发布库的应用

在项目中应用snapshot和release库&#xff0c;应用snapshot和release库达到不同环境下发布不同的版本的目的&#xff0c;首先看一个pom文件的定义&#xff1a; <project><modelVersion>4.0.0</modelVersion><groupId>cc.mzone</groupId><arti…

计算机网络安装系统怎么办,电脑没有网络如何重装系统

大家应该在线重装系统的时候安装下载到一半会提示您没有网络了&#xff0c;需要用户怎么解决呢&#xff1f;无法联网可以重装系统吗&#xff1f;下面让小编带您了解一下无网环境下重装系统的教程操作哦&#xff01;1&#xff0c;在其他可联网的电脑上&#xff0c;使用小白一键重…

python的return语句求两数之和_程序题(python解)

PyCharm整理代码&#xff1a;CtrlAltl list行数&#xff1a;len(list) list列数&#xff1a;len(list[1])笔试常使用到的功能&#xff1a; 1、单独取出一长串字符中每个单独的字符&#xff1a;输入‘abcd’&#xff0c;输出‘a’bcddef zifu(value):return list(map(str,str(va…

VSTO 得到Office文档的选中内容(Word、Excel、PPT、Outlook)

VSTO 得到Office文档的选中内容&#xff08;Word、Excel、PPT、Outlook&#xff09; 原文:VSTO 得到Office文档的选中内容&#xff08;Word、Excel、PPT、Outlook&#xff09; 目的&#xff1a;得到在Word、Excel、PPT、Outlook中选中的一段内容。 Word: private string GetSel…

用计算机桁架各杆内力,运用AUTO CAD求解桁架内力?

摘要&#xff1a; 一个平面汇交力系的平衡条件是其力多边形必须闭合,依其条件,利用图解法和计算机中的AUTO CAD绘图工具,迅速准确地求解一个结点上的两个未知力,并以其类推求解桁架各杆内力。特别在复杂的桁架内力计算中更显示其法优越性。关键词&#xff1a; CAD 桁架 内力一般…