ios - 手动如何在Objective C中的ARC下释放对象(NSString / NSMutableString ,..)
问题描述
初始化一个对象(NSString / NSMutableArray)并为其设置值。我需要解除分配对象,然后必须为该对象分配一个值以获取 已被解除分配的错误
手动尝试产生以下错误 EXC_BAD_ACCESS_KERN_INVALID_ADDRESS 0x00-012cbb4bb0。
EXC_BAD_ACCESS_KERN_INVALID_ADDRESS 0x00-020。
解决方案
您要求的内容很简单,但可能对您没有帮助。
__unsafe_unretained NSArray *array = [[NSArray alloc] initWithObjects:@"test", nil];
// Accessing `array` at this point will crash
在这里创建一个非空的 NSArray 很重要。空 NSArray 引用了一个无法释放的单例对象。同样,不要使用数组文字@[...]
,因为它们直接存储在二进制文件中,也不能被释放。NSString 也有类似的情况。
也就是说,这不太可能是追踪您所描述的错误的好方法。首先确保代码中没有警告。然后运行静态分析器。检查崩溃报告(希望它会给你一个提示涉及哪些类)。然后仔细检查你认为你正在崩溃的东西的用法(搜索它在程序中的使用;寻找类似的东西__unsafe_unreatined
或assign
)。然后打开 NSZombie(搜索一下;有很多关于它的使用教程)。
此外,您可能需要探索任何 C/C++ 代码,这些代码也会创建此异常。如果你通过不安全的线程破坏了内存,你就会得到这个异常。该异常只是告诉您您正在尝试访问一个无效的指针,而这可能来自很多方面。过度释放的 ObjC 对象是一个常见的原因,但不是唯一的原因。
推荐阅读
- wso2-am - 动态端点的故障转移 url 配置
- regex - Spring RequestMapping 正则表达式:将所有不带点 [.] 的 url 转发到 index.html
- flutter - 我正在尝试计算物品清单的总价
- python - 向月份和日期列添加零时出错
- android - flutter<->android 通信开销
- collections - 更新pymongo中集合列表项中的值
- gradle - Micronaut 从 2.0.0.M3 切换到 RC1:Gradle 不再执行任何测试
- c++ - 如何循环调用模板函数?
- node.js - JSON Parse 错误:使用 fetch 向后端发送请求时,React Native App 上出现意外的标识符“Tunnel”
- c# - 将查询从内连接更改为左连接时,日期时间列的格式正在更改