【问题标题】:What happens if your mark an autorelease object as autorelease如果您将自动释放对象标记为自动释放会发生什么
【发布时间】:2012-09-11 06:49:50
【问题描述】:

我的问题可能听起来很愚蠢,但我想知道如果我将自动释放的对象标记为自动释放会发生什么。会发布两次吗?还是什么都没发生?例如:

 Obj * obj = [[Obj create] autorelease];

假设[Obj create] 返回一个自动释放的对象。
如果我添加另一个自动释放,那么会发生什么?

【问题讨论】:

  • 自动释放会导致对象在某个时候收到释放消息,因此通过调用它两次,您将得到两个释放调用,过度释放对象。
  • +1 这个问题一点都不傻 :)

标签: objective-c ios memory-management autorelease


【解决方案1】:

是的,发送autorelease 两次将释放对象两次。如果您的 create 方法返回一个自动释放的对象,而您向它发送另一个 autorelease 消息,您的应用将崩溃,因为您将释放一个已释放的对象。

话虽如此,为什么不使用新的Automatic Reference Counting (ARC)?您不必再担心(自动)释放对象了。

【讨论】:

  • “你的应用会崩溃”好吧,到底发生了什么是未定义的
  • 是的。如果你幸运的话,它会崩溃。
【解决方案2】:

你使用类方法(+),你不应该关心内存。人们使用 Class Method 的一个原因是它可以返回一个自动释放对象。如果你释放或自动释放类方法返回的对象,它会崩溃。

【讨论】:

  • 它与类或实例方法无关。只是方法名称是否以newalloccopymutableCopyretain 开头
  • @newacct 类方法和实例方法有什么不同?如果我这样写使用实例:Obj * obj = [[[Obj alloc] init] autorelease];它会做得很好
  • @cloosen 您的示例使用alloc 一个类方法,该方法在@newacct 上面给出的列表中。由于它在列表中,调用者拥有返回的对象,因此在这种情况下,releaseautorelease 对象将是正确的。与它是类还是实例方法无关。 [NSURL URLWithString:@"http://www.stackoverflow.com"] 是一个类方法,它返回一个您不拥有的对象(它已经被自动释放)。如果您使用URLwithString: 创建releaseautorelease 一个NSURL 对象,您将过度释放并且很可能崩溃。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-09-08
  • 2012-02-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多