ошибки памяти при смене базового класса objective-c
решил получше разобраться в работе классов в objective-c и написать простой базовый класс, столкнулся со следующей проблемой: попытка вызвать метод у объекта наследующегося от Написанного класса приводит в segfault, при этом если наследоваться от NSObject проблем не возникает. Не совсем понятно, как базовый класс влияет на вызов методов и обращение к полям у наследников.
#include <objc/runtime.h>
#import <Foundation/Foundation.h>
__attribute__((objc_root_class))
@interface TestRoot
+alloc;
-(instancetype)init;
@end
@implementation TestRoot
+alloc {
return class_createInstance(self, 0);
}
-(instancetype)init {
return self;
}
@end
@interface FromNSObject : NSObject
@property(readwrite) int num;
@end
@implementation FromNSObject
-(instancetype)init {
self = [super init];
_num = 5;
return self;
}
-(void)print {
printf("%d\n", _num);
}
@end
@interface FromTestRoot : TestRoot
@property(readwrite) int num;
@end
@implementation FromTestRoot
-(instancetype)init {
self = [super init];
_num = 5;
return self;
}
-(void)print {
printf("%d\n", _num);
}
@end
int main(int argc, char const **argv) {
FromNSObject *ns = [[FromNSObject alloc] init];
[ns print]; // 5
FromTestRoot *ts = [[FromTestRoot alloc] init];
[ts print]; // segmentation fault
return 0;
}
Ответы (2 шт):
Автор решения: Dmitry Serov
→ Ссылка
Одного createInstance мало, нужен ещё constructInstance в инициализаторе, чтобы выделить память под сам объект и его ivarы
Автор решения: user23797921
→ Ссылка
Разобрался, если кому-то понадобится - всё что требовалось, добавить в TestRoot
поле isa
. После чего ошибки пропали и методы начали корректно отрабатывать:
__attribute__((objc_root_class))
@interface TestRoot
@property Class isa; //именно отсутствие этой штуки приводило к ошибкам.
+alloc;
-(instancetype)init;
@end