Ios ARC正在释放calloc';有记忆吗?

Ios ARC正在释放calloc';有记忆吗?,ios,automatic-ref-counting,calloc,Ios,Automatic Ref Counting,Calloc,我的代码中发生了一些奇怪的事情。基本上,我在做网络流应用程序,将一些数据传输到iOS上的环形缓冲内存中,然后读取内存。 在一些不确定的数据量之后,我得到了EXC\u BAD\u ACCESS。因此,我启用了NSZombieEnabled和NSAutoreleaseFreedObjectCheckEnabled,并设置了malloc_error_break,并且能够精确定位错误原因 MyMainClass具有该属性(还尝试了强引用,行为相同) @属性(非原子,保留)RingBuffer*readB

我的代码中发生了一些奇怪的事情。基本上,我在做网络流应用程序,将一些数据传输到iOS上的环形缓冲内存中,然后读取内存。 在一些不确定的数据量之后,我得到了
EXC\u BAD\u ACCESS
。因此,我启用了
NSZombieEnabled
NSAutoreleaseFreedObjectCheckEnabled
,并设置了
malloc_error_break
,并且能够精确定位错误原因

My
MainClass
具有该属性(还尝试了强引用,行为相同)

@属性(非原子,保留)RingBuffer*readBuffer

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

-(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;
}
如果删除推送调用,应用程序将不会崩溃。如果调用push调用,它将在一段时间后崩溃。有时我会得到
alloc:**对象0x1cad3404的错误:已释放对象的校验和不正确-对象可能在被释放后被修改。
***在malloc\u error\u break中设置断点以调试
。。。有时,这只是一个例外


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

在达到“如果条件为真”后,溢出设置为真。 但是,此程序从不将溢出重置为FALSE。 所以,m_head正在继续成长。 永远不要重置为零。 结果,缓冲区[m_head]从保留内存中访问

好吗

有没有可能ARC释放了calloced内存

不,那是不可能的。ARC是自动引用计数的缩写,是一种编译器功能,如果启用,它可以通过将释放、保留和自动释放内存调用直接插入到编译代码中来提供对目标C对象的自动内存管理。因为
buffer
不是一个Objective C对象,而是一个指向堆上分配的内存块的指针,它不是由ARC释放的。您有义务自己释放分配的内存块

要了解更多有关ARC工作原理的信息,请查看苹果公司的WWDC 2011会议视频:

基本上,我不明白的是,为什么这会导致这个问题


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

如果调用OC m_size bytes,您应该只写0..m_size-1。当m_head==m_size时写入缓冲区[m_head]通常会触发异常。我忘了包括if(m_head==m_size)m_head=0;在代码末尾。。。我现在无法证实这是否导致了这个特定的问题。最有可能,但我会在验证时添加注释。Thanx指出了事实是的就是这样。。对不起,苹果,与ARC的实现无关:)Thanx。