【问题标题】:Is it incorrect to re-assign to a pointer which contains an autoreleased object?重新分配给包含自动释放对象的指针是否不正确?
【发布时间】:2012-03-14 18:00:31
【问题描述】:

下面的结果是什么?

NSString *myStr = [[[NSString alloc] initWithString:@"Hello World."] autorelease];
myStr = [NSString stringWithString:@"Hello Again."];

myStr 是否被正确释放或崩溃,因为我们会在 myStr 上调用 autorelease,而 myStr 现在已设置为已自动释放的字符串?

【问题讨论】:

  • 只要使用ARC,它就能解决所有这些问题。与仅使用苹果推荐的 (ARC) 相比,向后兼容性要麻烦得多。
  • @RichardJ.RossIII 在所有情况下都不完全正确。例如,一些第三方库不支持 ARC。内存管理在 iOS 中仍然是一个必要的概念。
  • @MikeD 只需使用 -fno-objc-arc 编译库。 ARC 仍然是最好的选择。
  • 我们的应用程序非常庞大,我认为过渡到 ARC 需要很长时间。根据静态分析器,我们目前正在修复 500 多个内存问题:
  • 有趣的问题(虽然相当容易测试)。

标签: objective-c cocoa memory-management autorelease alloc


【解决方案1】:

您的代码示例按您期望的方式运行。 autorelease 在您发送消息后无法以某种方式更改它所指的对象。 @"Hello World."@"Hello Again." 对象是不同的对象,即使您的示例使用相同的指针变量来引用它们。

【讨论】:

  • 所以从技术上讲,自动释放将被发送到“Hello World。”,对吧?
  • “被发送到”?它已经已经发送了。这不像消息被排队等待稍后发送或其他什么。
  • 我的意思是,当自动释放池启动时,它会在“Hello World”上调用释放。?
  • 是的,我只是想确保版本不会被发送两次,我认为不会。感谢您的帮助。
猜你喜欢
  • 2015-12-20
  • 2012-08-02
  • 1970-01-01
  • 1970-01-01
  • 2016-06-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多