重新分配给包含自动释放对象的指针是不是不正确?

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”上调用释放。? 是的,我只是想确保版本不会被发送两次,我认为不会。感谢您的帮助。

以上是关于重新分配给包含自动释放对象的指针是不是不正确?的主要内容,如果未能解决你的问题,请参考以下文章

等号是不是在 char * 中重新分配内存?

问题重新分配分配的对象

mxDestroyArray 会正确释放重新分配的矩阵或更改大小的矩阵吗?

NSMutableArray 如何正确添加对象并释放

在C语言进行编程中,为啥要释放旧内存?

指针free后还存在吗?