几周前,我有机会学习iOS编程。 我的老板认为我更像是“计算机科学家”,而不是开发人员,这意味着我可以将自己的知识应用于开发一两个iPad应用程序–我要做的就是学习Objective-C, iOS SDK:到底有多难?

尽管过去我做过很多C / C ++,但自2001年以来我一直在做Java,所以我实际上忘记了很多我所知道的东西,此外,Objective-C还是不太像C ++。 结果是,您觉得自己在异国他乡被洗劫一空,无法说该语言,并且武装着晒黑和词典。

在学习所有这些新知识时,我意识到Java是一种非常好的语言,其原因首先是因为您不必考虑内存分配和释放,您可以继续编写应用程序。 在用Objective-C编写iOS应用程序时,您既要为对象分配内存,然后又要清理,然后将对象的内存返回给空闲池。 这似乎是21世纪第二个十年的老派。 此外,在为对象分配内存后,您必须跟踪对该对象的引用数量-一种称为引用计数的做法,这是我在前身为C ++程序员的过程中首次遇到的问题。 这里的基本思想是,每次创建对对象的新引用时,都将增加引用计数器,当完成对象引用后,您将减小其引用计数器。

当计数器达到零时,系统将内存释放回空闲池。 在Objective-C中,减少引用计数的功能称为release ; 因此,如果Java具有引用计数,并且例如,如果我想让AddressService查找我的地址,则需要执行以下操作:

// create an object and set the reference count to 1AddressService addressService = new AddressService();  // Use the objectAddress address = addressService.findAddress(id);// pass it to a methodmodel.addAttribute("address", address);// free the memory addressService.release();

那是简单的场景,但是如果某个方法或其他方法将对象引用作为方法参数传递给您,会发生什么情况? 在那种情况下,您必须决定如何坚持下去,似乎有两种方法可以做到这一点。 第一个是复制对象,第二个是增加其引用计数。 制作副本可能是最安全的主意,但会占用更多内存并会变慢,而增加引用计数很快,但不如程序的其他部分那么安全,可能会使引用计数错误并使计数减少太多次,这意味着您已经引用了一些可能已释放的内存,并且当您尝试访问释放的对象时,程序将崩溃……。 同样,如果Java具有引用计数,那么Spring Controller请求处理程序方法将如下所示:

@RequestMapping(value = "/find", method = RequestMethod.GET)public String findAddress(@RequestParam("id") int id, Model model) {// increment the reference count - 'retain' is the Objective-C method for doing this.model.retain();    // create a new string object - with reference count of oneString msg = new String().withFormat("Processing an address page request for address with id: " + id);// pass the string to the loggerlogger.info(msg);// release the string's memorymsg.release();AddressService addressService = new AddressService();Address address = addressService.findAddress(id);model.addAttribute("address", address);addressService.release();// finished with the modelmodel.release();return "address-display";}

这里有两点需要注意–首先,将处理程序方法传递给模型对象,因此我通过调用keep来增加引用计数,然后在方法结束后在模型上调用release来调用引用计数。 其次,即使在创建琐碎的对象(例如传递给记录器的消息字符串)时,您也必须应用引用计数规则并在完成后释放内存。

下面的示例演示了增加引用计数的替代方法:制作自己的对象副本…

@RequestMapping(value = "/find", method = RequestMethod.GET)public String findAddress(@RequestParam("id") int id, Model model) {// increment the reference count - 'retain' is the Objective-C method for doing this.Model myModel = model.copy();    // As previous example// finished with the modelmyModel.release();return "address-display";}

这些示例只是微不足道的,有大量引用计数规则需要应用,如果弄错了,Ka-Bam程序就会崩溃,弄错了意味着您尝试访问已经释放的内存,或者变慢由于忘记了释放一些内存而导致的内存泄漏而死亡。 尽管我猜这里的关键是所有权 :如果您拥有一个对象,则增加它的引用计数,当您完成一个对象后,再减少它的引用计数。

上面的代码只是写了些杂文来说明这一点–它不会编译。 该代码实际上来自我在GitHub上的Address示例,在现实生活中看起来像这样:

@RequestMapping(value = "/find", method = RequestMethod.GET)public String findAddress(@RequestParam("id") int id, Model model) {logger.info("Processing an address page request for address with id: " + id);Address address = addressService.findAddress(id);model.addAttribute("address", address);return "address-display";}

……体积更小,更容易理解。 最后一点,你们中的一些人会注意到,在引用计数示例中,我分配了(Objective-C字)新的AddressService –这是因为iOS编程与依赖注入或Spring框架完全不同,因此您将回到为自己创建对象。 (在Spring给家伙们的说明:“ Spring iOS” –对我来说听起来像是个主意……)

那些知道的人将着重强调一个事实,即苹果公司最近推出了一种称为“自动引用计数”的东西。 虽然它不是垃圾收集,它的简化,内部监督办公室现在会自动追踪您的指针引用的内存和可用内存为你当计数达到为零,这意味着东西,你不必费心调用保留和释放方法。

另外,此博客也没有贬低Objective-C –我非常喜欢Objective-C。 与Java相比,它的语法看起来相当晦涩难懂,但感觉很冗长,但是它迫使您在编程技术上要更有纪律,因此,如果像我一样,您认为好的编程就取决于“思想的清晰性”,那么在编写Objective-在C程序中,您必须更加清楚一点,而且我真的很喜欢。

我还猜想,很多读者可能会提出许多原因,说明他们为什么认为Java是一种糟糕的语言,以及为什么他们喜欢的语言“做得更好”,无论它是什么,所以我很期待对您的评论...

最后,在iOS编程方面,我只是一个“新手”,因此,如果有任何iOS / Objective-C大师遇到此博客,请告诉我我错了。

参考: Java不是一种文明语言吗? 来自我们的JCG合作伙伴   调试队长博客的 Roger Hughes。

翻译自: https://www.javacodegeeks.com/2012/02/isnt-java-civilised-language.html

Java不是文明语言吗?相关推荐

  1. dart语言和java语言_Java不是文明语言吗?

    dart语言和java语言 几周前,我有机会学习iOS编程. 我的老板认为我更像是"计算机科学家",而不是开发人员,这意味着我可以将自己的知识应用于开发一两个iPad应用程序–我要 ...

  2. 深入理解Java 8 Lambda(语言篇——lambda,方法引用,目标类型和默认方法)

    作者:Lucida 微博:@peng_gong 豆瓣:@figure9 原文链接:http://zh.lucida.me/blog/java-8-lambdas-insideout-language- ...

  3. 各种编程语言功能综合简要介绍(C,C++,JAVA,PHP,PYTHON,易语言)

    各种编程语言功能综合简要介绍(C,C++,JAVA,PHP,PYTHON,易语言) 总结 a.一个语言或者一个东西能火是和这种语言进入某一子行业的契机有关.也就是说这个语言有没有解决社会急需的问题. ...

  4. c语言 python-C语言、Java语言和python语言的区别在哪里

    原标题:C语言.Java语言和python语言的区别在哪里 我们经常听到C语言.Java语言和python语言,那么这三者的区别在哪里呢?随着科技的进步以及新技术的推进,编程语言的种类也是越来越多,随 ...

  5. java为何是跨平台语言,以及java如何运行

    java为何是跨平台语言 java是跨平台语言:一次编写,处处运行(因为有各种类型的jvm,不跨平台) 如图所示: java如何执行 写代码(java) ->(class)->执行clas ...

  6. java开发环境及数据类型实验_实验项目1 Java开发环境与语言基础

    <实验项目1 Java开发环境与语言基础>由会员分享,可在线阅读,更多相关<实验项目1 Java开发环境与语言基础(14页珍藏版)>请在人人文库网上搜索. 1.实验项目1 Ja ...

  7. java更好的语言_五个使Java变得更好的功能

    java更好的语言 我偶然发现了Brian Goetz 提出的有关Java数据类的建议 ,立即意识到我也对如何使Java更好地成为一种语言有一些想法. 我实际上有很多,但这只是五个最重要的简短列表. ...

  8. java更好的语言_Java,如果这是一个更好的世界

    java更好的语言 只是梦想着有一个更好的世界,在该世界中,Java平台中的一些旧错误已得到纠正,而某些令人敬畏的缺失功能也已实现. 不要误会我的意思. 我认为Java很棒. 但是它仍然存在一些问题, ...

  9. Java:本地最小语言

    在1996年至2002年之间,我用Java编写了成千上万行代码.我用Java 1.0到Java 1.4编写了Web框架,电子表格以及更多内容. 与90年代中期(预模板)的C ++相比,Java是一种完 ...

最新文章

  1. AI一分钟 | 马斯克再放豪言:我要造的AI的芯片“全球最棒”;刚上路就被叫停,可能是美国对快递机器人最严厉的打击
  2. 【机器学习基本理论】详解最大后验概率估计(MAP)的理解
  3. 关于VMFS6 Block 1M 512M 说明
  4. matlab 叠加 area,[转载]matlab学习——area填色图
  5. Django从理论到实战(part43)--HttpResponse对象
  6. 理正地基基础计算机辅助设计的英文缩写,理正基础CAD软件介绍理正基础CAD软件介绍.pdf...
  7. Java与Python:哪一种最适合您? [信息图]
  8. jQuery下如何使用Json传递数据
  9. java vector 输出_5.7(java学习笔记)Vector、Enumeration
  10. qxdm无法安装问题闪一下_win10系统显示“出现了问题,无法安装功能”解决办法...
  11. popen() 函数 讲解
  12. 解决win7下PIL无法打开图片的问题
  13. Day4:html和css
  14. 51NOD 1449 砝码称重(贪心+进制思想)
  15. Qt怎么实现将bmp图片转换成Ascii_你保存的word和pdf文档图片为什么变模糊了?
  16. w8系统服务器垃圾清理,win8系统盘太大怎么办?来给TA瘦身吧! | SDT技术网
  17. 加拿大IC VOC和无线产品IC ID认证
  18. 【观察】揭秘:中信银行信用卡新核心系统自研之路
  19. 为什么在中国电子工程师不如搞软件的?
  20. 【蓝桥杯】 历届试题 合根植物(并查集)

热门文章

  1. tomcat(1)一个简单的web server
  2. jdk 加密_使用JDK的密码流的加密怪癖(以及该怎么做)
  3. rest web服务_在WildFly的REST Web服务中与Jackson的双向关系
  4. spring-retry_使用Spring-Retry重试处理
  5. 注解默认继承_默认方法和多重继承
  6. spring batch_Spring Batch作为Wildfly模块
  7. 带有Spring Security的OAuth 2.0快速指南
  8. mongodb插入速度每秒_MongoDB事实:商品硬件上每秒插入80000次以上
  9. 使用Spring Boot构建RESTFul服务
  10. eclipse juno_放弃Eclipse Juno