Неправильное поведение массива Objective-C (EXC_BAD_ACCESS) - PullRequest
1 голос
/ 21 октября 2010

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

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

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

@property float *d;

.m файл:

@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, хотя не могу найти причину, почему это так.Кто-нибудь видит что-то, чего мне не хватает?

Ответы [ 3 ]

9 голосов
/ 21 октября 2010

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

MyObject *k = [[MyObject alloc] init];
1 голос
/ 21 октября 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.

0 голосов
/ 21 октября 2010

Определение вашего свойства должно выглядеть так:

@property float* d; // missing the '*'
...