首页 > 解决方案 > 手动如何在Objective C中的ARC下释放对象(NSString / NSMutableString ,..)

问题描述

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

手动尝试产生以下错误 EXC_BAD_ACCESS_KERN_INVALID_ADDRESS 0x00-012cbb4bb0。
EXC_BAD_ACCESS_KERN_INVALID_ADDRESS 0x00-020。

标签: iosobjective-cmemory-managementexc-bad-accessdealloc

解决方案


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

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

在这里创建一个非空的 NSArray 很重要。空 NSArray 引用了一个无法释放的单例对象。同样,不要使用数组文字@[...],因为它们直接存储在二进制文件中,也不能被释放。NSString 也有类似的情况。

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

此外,您可能需要探索任何 C/C++ 代码,这些代码也会创建此异常。如果你通过不安全的线程破坏了内存,你就会得到这个异常。该异常只是告诉您您正在尝试访问一个无效的指针,而这可能来自很多方面。过度释放的 ObjC 对象是一个常见的原因,但不是唯一的原因。


推荐阅读