重新分配给包含自动释放对象的指针是不是不正确?
Posted
技术标签:
【中文标题】重新分配给包含自动释放对象的指针是不是不正确?【英文标题】: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 多个内存问题: 有趣的问题(虽然相当容易测试)。 【参考方案1】:您的代码示例按您期望的方式运行。 autorelease
在您发送消息后无法以某种方式更改它所指的对象。 @"Hello World."
和 @"Hello Again."
对象是不同的对象,即使您的示例使用相同的指针变量来引用它们。
【讨论】:
所以从技术上讲,自动释放将被发送到“Hello World。”,对吧? “被发送到”?它已经已经发送了。这不像消息被排队等待稍后发送或其他什么。 我的意思是,当自动释放池启动时,它会在“Hello World”上调用释放。? 是的,我只是想确保版本不会被发送两次,我认为不会。感谢您的帮助。以上是关于重新分配给包含自动释放对象的指针是不是不正确?的主要内容,如果未能解决你的问题,请参考以下文章