Присвоение экземпляра дисперсии в методе приводит к segfault - PullRequest
0 голосов
/ 15 октября 2018

Ниже приведен довольно базовый код задачи.Он содержит одну переменную экземпляра i.Проблема в том, что всякий раз, когда я пытаюсь присвоить ему, это приводит к segfault почти сразу после этой операции присвоения.Примечание: это не сегфоут в точке назначения.Обычно это происходит после назначения, и я пытаюсь вызвать метод.ТАКЖЕ, обратите внимание, что это не ваш стандартный код mac / apple target-c.Я использую простую ванильную версию cygwin (Linux).Поэтому я должен сгенерировать свои собственные alloc и dealloc методы.

#import <objc/runtime.h>
#import <objc/Object.h>

@interface Test
{
    int i;
}

+(id)alloc;
- (id) init;
- (int) load;
@end

@implementation Test

+(id)alloc
{
    self = class_createInstance(self,0);
    return self;
}

-(id)init
{
    i = 0; // <------ if I comment out this line, there is no segfault
    return self;
}

-(int) load
{
    return i;
}

@end


int main(int argc, const char * argv[])
{
    Test * test = [[Test alloc] init];
    int v = [test load]; //segfaults here (NOTE: if I comment out this line, it does not segfault)
    return 0;
}

Что вызывает ошибку segfault?

1 Ответ

0 голосов
/ 16 октября 2018

Я ожидаю, что для корневого класса, подобного вашему, вам необходимо явно объявить переменную экземпляра isa.Без этого ваш i интерпретируется так, как если бы это был isa, поэтому вы получаете сбой.

Итак:

@interface Test
{
    Class isa;
    int i;
}

Если вы не собиралисьчтобы создать корневой класс, вы, вероятно, должны наследовать от Object или подобного.

...