gpt4 book ai didi

ios - ARC 正在释放调用的内存?

转载 作者:塔克拉玛干 更新时间:2023-11-02 10:13:20 25 4
gpt4 key购买 nike

我的代码中发生了一些奇怪的事情。基本上我在做网络流应用程序,将一些数据传输到 iOS 上的环形缓冲区内存中,然后读取内存。在一些不确定的数据量之后,我得到了 EXC_BAD_ACCESS。所以我启用了 NSZombieEnabledNSAutoreleaseFreedObjectCheckEnabled 并设置了 malloc_error_break 并且能够查明错误原因。

我的 MainClass 有这个属性(也尝试过强引用,同样的行为)

@property (nonatomic, retain) RingBuffer *readBuffer;

RingBuffer 类中,我将缓冲区大小初始化为:

-(id) initWithSize: (NSInteger) size
{
self = [super init];
m_size = size;
buffer = (unsigned char *)calloc(m_size, sizeof(unsigned char));
overflow = FALSE;
m_tail = 0;
m_head = 0;
error = 0;
return self;
}

之后,我使用push方法向ringbuffer中插入数据

- (void) push: (unsigned char) byte
{
if (m_head == m_size && overflow == FALSE) {
m_head = 0;
overflow = TRUE;
}
buffer[m_head] = byte;
m_head ++;
if (overflow) m_tail++;
if (m_tail == m_size) m_tail = 0;
}

如果我删除推送调用,应用程序将不会崩溃。如果调用推送调用,它会在一段时间后崩溃。有时我得到 alloc: *** error for object 0x1cad3404: incorrect checksum for freed object - 对象可能在被释放后被修改。
*** 在malloc_error_break 中设置断点调试
... 有时只是EXC_BAD_ACCESS。

基本上,我不明白的是为什么这会导致问题? ARC 是否有可能释放了调用的内存?

最佳答案

Is it possible that ARC released the calloced memory ?

不,那是不可能的。 ARC 是 Automatic Reference Counting 的缩写,是一种编译器功能,如果启用,它会通过将 release、retain 和 autorelease 内存调用直接插入编译代码来提供 Objective C 对象的自动内存管理。由于 buffer 不是 Objective C 对象,而是指向堆上已分配内存块的指针,ARC 不会释放该内存块。您有义务自行释放分配的内存块。

要了解有关 ARC 工作原理的更多信息,请查看 Apple 的 WWDC 2011 session 视频:Introducing Automatic Reference Counting .

Basically, what i don't understand is why is this causing the issue ?

很难说,但问题可能是 m_head 仅在 m_head == size && overflow == FALSE 时设置为零。此条件仅在第一次 m_head 等于 m_size 时为真(因为溢出 == FALSE),但下一次 m_head 将不再为真> 等于 m_size,因为 overflow 等于 TRUE(并且 m_head 不会重置为 0)。

关于ios - ARC 正在释放调用的内存?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12902778/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com