尽管过去我做过很多C / C ++,但自2001年以来我一直在做Java,所以我实际上忘记了很多我所知道的东西,此外,Objective-C还是不太像C ++。 结果是,您觉得自己在异国他乡被洗劫一空,无法说该语言,并且武装着晒黑和词典。
引用计数的做法,这是我在前身为C ++程序员的过程中首次遇到的问题。 这里的基本思想是,每次创建对对象的新引用时,都将增加引用计数器,当完成对象引用后,您将减小其引用计数器。
release ; 因此,如果Java具有引用计数,并且例如,如果我想让AddressService查找我的地址,则需要执行以下操作:
// create an object and set the reference count to 1
AddressService addressService = new AddressService();
// Use the object
Address address = addressService.findAddress(id);
// pass it to a method
model.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 one
String msg = new String().withFormat("Processing an address page request for address with id: " + id);
// pass the string to the logger
logger.info(msg);
// release the string's memory
msg.release();
AddressService addressService = new AddressService();
Address address = addressService.findAddress(id);
model.addAttribute("address", address);
addressService.release();
// finished with the model
model.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 model
myModel.release();
return "address-display";
}
所有权
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";
}
AddressService
保留和释放方法。
另外,此博客也没有贬低Objective-C –我非常喜欢Objective-C。 与Java相比,它的语法看起来相当晦涩难懂,但感觉很冗长,但是它迫使您在编程技术上要更有纪律,因此,如果像我一样,您认为好的编程就取决于“思想的清晰性”,那么在编写Objective-在C程序中,您必须更加清楚一点,而且我真的很喜欢。
我还猜想,很多读者可能会提出许多原因,说明他们为什么认为Java是一种糟糕的语言,以及为什么他们喜欢的语言“做得更好”,无论它是什么,所以我很期待对您的评论...
最后,在iOS编程方面,我只是一个“新手”,因此,如果有任何iOS / Objective-C大师遇到此博客,请告诉我我错了。