Неверное поведение массива поплавков Objective-C (EXC_BAD_ACCESS)

Я объявляю массив примитивов для одного из своих объектов и не могу получить к нему доступ извне. Я новичок в ObjectiveC, есть ли очевидная ошибка, которую я делаю?

заголовочный файл:

@interface MyObject : NSObject {
    //@public <-- this shouldn't be necessary, right? I have accessors!
    float *d;   
}

@property float *d;

.м файл:

@synthesize d;

-(id) init {
...
    self.d    = (float*) malloc(sizeof(float) * n); //n > 1000
...
}

место осуществления доступа:

MyObject* k = [MyObject init];

NSLog(@"%f",k.d[0]);

Я получаю сообщение об ошибке EXC_BAD_ACCESS в последней строке, хотя не могу найти причину, почему это так. Кто-нибудь видит что-то, что я упускаю?


person blueberryfields    schedule 20.10.2010    source источник
comment
Вау, этот код даже не должен компилироваться.   -  person Chuck    schedule 21.10.2010
comment
Переменная n не определена.   -  person Garrett    schedule 21.10.2010
comment
Я не думаю, что это ваш настоящий код, так как он не скомпилируется. Пожалуйста, создайте реальный минимальный пример, демонстрирующий проблему, которую мы можем запустить через GCC и увидеть сбой своими глазами.   -  person Chuck    schedule 21.10.2010
comment
Да, код не полный. Я использовал символы «...», чтобы показать, где самые большие пробелы :)   -  person blueberryfields    schedule 22.10.2010


Ответы (3)


Вам нужно выделить свой объект!

MyObject *k = [[MyObject alloc] init];
person Garrett    schedule 20.10.2010
comment
Это правда, но я не могу поверить, что это проблема. Это должно немедленно привести к сбою с исключением неправильного аргумента, поскольку классы не реагируют на инициализацию. Если это проходит там, он не должен показывать нам настоящий код. - person Chuck; 21.10.2010
comment
Оказывается, было две ошибки — код, выполняющий доступ, выполнялся до инициализатора, и я неправильно размещал свой объект. - person blueberryfields; 22.10.2010

Я скомпилировал и запустил версию кода следующим образом:

@interface FloatClass : NSObject
{
    float* d;
}

@property float* d;

@end

@implementation FloatClass

@synthesize d;

-(id) init
{
    self = [super init];
    if (self != nil)
    {
        d = malloc(sizeof(float) * 10);
    }
    return self;
}

@end

int main(int argc, char *argv[])
{
    NSAutoreleasePool* pool = [[NSAutoreleasePool alloc] init];

    FloatClass* k = [[FloatClass alloc] init];
    NSLog(@"%f", k.d[0]);

    [pool drain];
}

Он работал нормально и напечатал 0.00000. Поэтому я считаю, что что-то не так с кодом, который вы нам не показываете.

NB, если я делаю k = [FloatClass init], я получаю исключение NSInvalidArgument.

NB 2. Убедитесь, что метод init возвращает self.

person JeremyP    schedule 21.10.2010
comment
Да, вы правы, это должно было быть исключением - оно маскировалось другими компонентами системы, из-за чего код доступа выполнялся до инициализатора. - person blueberryfields; 22.10.2010

Ваше определение свойства должно гласить:

@property float* d; // missing the '*'
person fbrereto    schedule 20.10.2010
comment
спасибо - пропустил эту опечатку при написании вопроса. У моего источника *, это не причина моего горя :( - person blueberryfields; 21.10.2010