2013-12-02 4 views
0

Я знаю, что есть тонны вопросов с тем же вопросом, но никто мне не помог.Тема 1: EXC_BAD_ACCESS code = 1 float *

У меня есть DimensionItemHolder объектов и имущества:

@property(nonatomic) float * sum; 

в функции рекурсии у меня есть:

DimensionItemHolder * holder = [self getDimensionItemWhitIndex:[dimensionItem.dimItemID shortValue]]; 

if (holder) 
{ 

    NSLog(@"%f , %f , %f , %f , %f : %p", holder.sum[0],holder.sum[1],holder.sum[2],holder.sum[3],holder.sum[4] , holder.sum); 

    [self.itemOrderdArray removeObject:holder]; 
    [self substractSum:holder.sum]; 
    NSLog(@"%p", holder.sum); 
    return holder.sum; 
} 

И после нескольких итераций Xcode броска

Thread 1: EXC_BAD_ACCESS(code = 1, address 0xc080000c) 

на линии

NSLog(@"%p", holder.sum); 

Я Figer его, что он должен делать йоту функцию

[self substractSum:holder.sum]; 

(если я комментирую его она работает)

эта функция:

-(void)substractSum:(float *)subSum{ 
if (subSum) { 
    self.sum[0] = self.sum[0] - subSum[0]; 
    self.sum[1] = self.sum[1] - subSum[1]; 
    self.sum[2] = self.sum[2] - subSum[2]; 
    self.sum[3] = self.sum[3] - subSum[3]; 
    self.sum[4] = self.sum[4] - subSum[4]; 
} 

}

+0

Не могли бы вы показать нам, где вы malloc/освободите массив? Кроме того, попробуйте явно указать свойство как «(неатомное, назначить)», интересно, изменилось бы это. –

+0

Попробуйте выполнить код с включенным NSZombie, который даст вам журнал, на который ссылается выделенный объект. Как включить NSZmobie? проверьте [здесь] (http://stackoverflow.com/questions/2190227/how-do-i-set-up-nszombieenabled-in-xcode-4). – execv

+0

Я malloc его в состоянии init объекта и освободить его на - (void) dealloc –

ответ

0

Наконец-то я понял.

Это была глупая вещь. Я malloc памяти для 4 поплавков, и я прошу его держатель [4], который является 5 элементов.

Спасибо всем за помощь

0

Я думаю, вы используете float *, чтобы насладиться характеристиками указателя C и сделать sum[i]. Но здесь вы находитесь в объективе C, используйте NSArray, заполненный поплавками.

+1

Да, это причина поплавка *. Я использую его из-за проблемы с производительностью. Но нет причин для использования NSArray для этой ошибки. –

+1

Объект 'NSArray' не может содержать поплавки. Вам нужно будет использовать 'NSNumber' с поплавковыми значениями. То же самое, но другое :) –

+0

Как говорит Гай Конгус, nsarray нуждается в объектах, и этот объект должен быть создан как NSArray, и для этого требуется время. Если вы заполняете 500 000 данных в наборе данных, существует разница в 4 минуты использования NSArray или float *. Но этот вопрос не отвечает на мой вопрос. –

Смежные вопросы