如何在目标 C 中手动解除分配 ARC 下的对象 (NSString / NSMutableString ,..)

Manually how to deallocate an object (NSString / NSMutableString ,..) under ARC in Objective C

提问人:Rajendran 提问时间:2/18/2021 更新时间:2/28/2021 访问量:246

问:

初始化一个对象 (NSString / NSMutableArray) 并为其设置值。我需要解除分配对象,然后必须为该对象分配一个值,以获得已释放的错误

手动尝试生成以下错误 EXC_BAD_ACCESS_KERN_INVALID_ADDRESS 0x00-012CBB4BB0型
EXC_BAD_ACCESS_KERN_INVALID_ADDRESS 0x00-020。

ios objective-c 内存管理 exc-bad-access dealloc

评论

1赞 DonMag 2/18/2021
您需要显示一些代码。如何解除分配对象?您如何尝试为其赋值?而且,最重要的是,为什么要尝试为已释放的对象赋值?
0赞 Rajendran 2/18/2021
@DonMag我遇到了一些生产问题。在调试中,它会执行而不会出错。发布应用程序后,在某些情况下它会因 EXC_BAD_ACCESS_KERN_INVALID_ADDRESS 0x00-012CBB4BB0 或 EXC_BAD_ACCESS_KERN_INVALID_ADDRESS 0x00-020 而崩溃。这些错误无法在开发模式下重现。因此,尝试最初创建错误,然后解决问题。
0赞 DonMag 2/18/2021
如果您不知道在哪里或如何解除分配对象,或者您尝试在哪里或如何访问它们,那么将很难提供帮助。你有符号化的崩溃日志吗?

答:

2赞 Rob Napier 2/18/2021 #1

你要求的很简单,但可能对你没有帮助。

__unsafe_unretained NSArray *array = [[NSArray alloc] initWithObjects:@"test", nil];
// Accessing `array` at this point will crash

在此处创建一个非空的 NSArray 非常重要。空 NSArray 引用无法解除分配的单一实例对象。同样,不要使用 数组文字 ,因为它们直接存储在二进制文件中,也无法解除分配。NSString 也是如此。@[...]

也就是说,这在某种程度上不太可能是追踪您所描述的错误的好方法。首先确保代码中没有警告。然后运行静态分析器。检查崩溃报告(希望它能给你一个提示,说明涉及哪些类)。然后仔细检查你认为你正在崩溃的东西的用法(在程序中搜索它的用法;寻找类似或的东西)。然后打开 NSZombie(搜索它;有很多关于它的使用教程)。__unsafe_unreatinedassign

此外,您可能需要浏览任何 C/C++ 代码,这也会创建此异常。如果您通过不安全的线程损坏了内存,则可能会出现此异常。该异常只是告诉您正在尝试访问无效指针,这可能来自许多方面。过度释放的 ObjC 对象是常见原因,但不是唯一原因。

0赞 user102008 2/28/2021 #2

访问未分配的内存是未定义的行为。未定义的行为意味着不能保证它崩溃或执行任何特定操作。它可能在一种情况下崩溃,而在另一种情况下不会崩溃。你不能依靠它做任何事情。