私のコードで何か奇妙なことが起こっています。基本的には、iOSのリングバッファメモリにデータを転送し、その後メモリを読み取るネットワークストリームアプリケーションを実行しています。EXC_BAD_ACCESS
不確定な量のデータを取得していました。だから私は有効 NSZombieEnabled
にして設定しNSAutoreleaseFreedObjectCheckEnabled
、malloc_error_break
エラーの原因を特定することができました。
私MainClass
はプロパティを持っています(これも強い参照で試されました、同じ動作)
@property(非アトミック、保持)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メソッドを使用してリングバッファにデータを挿入します
- (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 - object was probably modified after being freed.
*** set a breakpoint in malloc_error_break to debug
...時々それはちょうどEXC_BAD_ACCESSです。
基本的に、私が理解していないのは、なぜこれが問題を引き起こしているのですか?ARCがcallocedメモリを解放した可能性はありますか?