软件下载网站如何建设,建筑设计公司名称,网站申请免费,网软志成企业网站管理系统dart语言和java语言几周前#xff0c;我有机会学习iOS编程。 我的老板认为我更像是“计算机科学家”#xff0c;而不是开发人员#xff0c;这意味着我可以将自己的知识应用于开发一两个iPad应用程序–我要做的就是学习Objective-C#xff0c; iOS SDK#xff1a;到底有多难… dart语言和java语言 几周前我有机会学习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 strings 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相比它的语法看起来相当晦涩让人感到冗长但是它迫使您在编程技术上要更有纪律因此如果像我一样您认为良好的编程取决于“思想的明确性”那么在编写目标代码时-在C程序中您必须更加清楚一点而且我真的很喜欢。 我还猜想很多读者可能会提出许多原因说明他们为什么认为Java是一种糟糕的语言以及为什么他们喜欢的语言“做得更好”无论它是什么所以我很期待对您的评论... 最后在iOS编程方面我只是一个“新手”因此如果有任何iOS / Objective-C大师遇到过此博客请告诉我我错了。 参考 Java不是一种文明语言吗 来自我们的JCG合作伙伴 调试队长博客的 Roger Hughes。 翻译自: https://www.javacodegeeks.com/2012/02/isnt-java-civilised-language.htmldart语言和java语言