【问题标题】:NSURLRequest autorelease?NSURLRequest 自动释放?
【发布时间】:2011-06-10 21:31:17
【问题描述】:

当我对 NSURLRequest 使用 autorelease 时,应用程序崩溃了。

 NSURLRequest *getRequest = [[NSURLRequest requestWithURL:[NSURL URLWithString:query]] autorelease];

我是 obj-c 的新手,我不确定内存管理是如何工作的。我需要手动执行[getRequest release] 吗?

如果是这样,我应该什么时候做...在我创建 NSURLConnection 之后?

还是 NSURLConnection 释放请求?

我遇到的一个相关问题是 NSMutableArray。当我将一个对象添加到数组中时,是否需要在将其添加到数组后释放该对象?添加到数组中的对象的内存生命周期是多少?

【问题讨论】:

    标签: objective-c ios4 memory-management nsurlconnection


    【解决方案1】:

    在你用 ObjC 编码之前彻底研究这个 http://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/MemoryMgmt/MemoryMgmt.html.

    回答您的问题:

    requestWithURL 提供了一个自动释放的对象,因此不需要释放/自动释放(作为一个经验法则,大多数类(工厂)方法都提供自动释放的对象 - 在释放它们之前检查文档)。

    无需显式释放添加到 Array/Dictionary 的对象。它们在从 Array/List 中删除或删除集合时被释放。 (本质上添加到数组+从数组中删除会平衡)

    【讨论】:

    • 谢谢。如果我在我的数组上调用 removeAlObjects,那也会删除添加到数组中的对象吗?
    • 类似地,如果我做一个 objectAtIndex 并获得一个指向该对象的指针,当我处理完我得到的对象时是否需要释放它?
    • @ser605957 objectAtIndex 为您提供存储在该特定索引处的对象 - 不多也不少。现在自己决定,如果你必须发布任何东西:)
    • 我猜不是...因为它是同一个对象,我没有再次保留或分配它,所以引用计数是一个
    【解决方案2】:

    一旦你(或当前例程)完成一个对象,你就释放它。如果您使用自动释放,则不需要释放(顾名思义)。

    【讨论】:

    • 当我把那个对象放入数组的时候会怎样...数组是否添加了另一个引用,在这种情况下我需要在添加到数组后释放它?
    • 没有。当数组被释放时,数组将释放它。它已取得所有权并将放弃它。
    • 在添加之前和之后请求它。据我了解,retainCounts 不可靠。
    • 不! :) 不要看保留计数。它可能会正确一次或两次,如果您检查它,将对象添加到数组中,然后再次检查它,您可能会侥幸逃脱,但这是一个坏习惯。无法保证 NSArray 的内部结构或框架中的任何其他内容不会为您背后的对象添加 100 个保留。
    • @Deepak @Josh Caswell 我让步了。我通常将保留计数打印到日志中,以确保它按预期递增/递减。我按照 Deepak 的建议进行操作,并在操作之前和之后打印,这样我就不会捕获自动释放事件(通常)。但我同意,永远不要将它构建到代码中。我删除了评论,以防有人从中推断出来。
    【解决方案3】:
     [NSURLRequest requestWithURL:[NSURL URLWithString:query]]
    

    返回一个自动释放的对象,因此您不必添加自动释放消息

    否则你可以将它保留在一个类属性中并在以后释放它

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-11-09
      • 2011-05-03
      • 1970-01-01
      • 2011-05-08
      • 1970-01-01
      • 2011-11-28
      • 1970-01-01
      相关资源
      最近更新 更多