尽管过去我做过很多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大师遇到此博客,请告诉我我错了。