提问人:Rajendran 提问时间:2/18/2021 更新时间:2/28/2021 访问量:246
如何在目标 C 中手动解除分配 ARC 下的对象 (NSString / NSMutableString ,..)
Manually how to deallocate an object (NSString / NSMutableString ,..) under ARC in Objective C
问:
初始化一个对象 (NSString / NSMutableArray) 并为其设置值。我需要解除分配对象,然后必须为该对象分配一个值,以获得已释放的错误
手动尝试生成以下错误
EXC_BAD_ACCESS_KERN_INVALID_ADDRESS 0x00-012CBB4BB0型
EXC_BAD_ACCESS_KERN_INVALID_ADDRESS 0x00-020。
答:
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_unreatined
assign
此外,您可能需要浏览任何 C/C++ 代码,这也会创建此异常。如果您通过不安全的线程损坏了内存,则可能会出现此异常。该异常只是告诉您正在尝试访问无效指针,这可能来自许多方面。过度释放的 ObjC 对象是常见原因,但不是唯一原因。
0赞
user102008
2/28/2021
#2
访问未分配的内存是未定义的行为。未定义的行为意味着不能保证它崩溃或执行任何特定操作。它可能在一种情况下崩溃,而在另一种情况下不会崩溃。你不能依靠它做任何事情。
评论