2015-04-25 5 views
1

Я бегу в странные проблемы, где я пытаюсь динамически создать новый экземпляр свойства Class (arrayClass), который я задал и хранящегося ранее:Objective-C: Почему мой объект создается как __NSMallocBlock__?

NSObject *instance = [[self.arrayClass alloc] init]; 
if (![instance isKindOfClass:self.arrayClass]) 
    NSLog(@"Say what?!"); 

Если я нарушу и войти self.arrayClass, он показывает правильный класс на консоли (в данном случае - Store), но когда я пытаюсь создать его экземпляр динамически и регистрирую тип экземпляра, он показывает свой класс как __NSMallocBlock__.

Что происходит?

ответ

2

Оказалось, что это была очень глупая ошибка. Я каким-то образом создал пустой метод init в классе, который я пытался создать, но забыл его реализовать (или даже вернуть что-либо). Как ни странно, компилятор не жаловался на это.

Вот что пустой метод инициализации выглядел как:

- (instancetype)init { 

} 

Очевидно, так как я не определения или возвращения self, среда выполнения не получает объект обратно из init, что он ожидает. То, что это делает, получает, как ни странно, этот тип __NSMallocBlock__ и пытается сделать что-то очень похожее на этот объект, что приведет к сбою.

+3

Как представлено - [init] явно не возвращает значение, оно возвращает мусор, который случайно появился в регистре eax или в другом месте, которое используется платформой ABI для возврата значения. Здесь он, кажется, является указателем на некоторый объект блока (возможно, уже выпущенный), просто кладя на кучу. Если бы вам повезло больше, это указывало бы на то, что вы не получите segfault. Кстати, как вы пропустили предупреждение? – user3125367

+0

@ user3125367: возможно, у него были все предупреждения выключены :) – Cristik

+0

Честно говоря, в Obj-C честно так много предупреждений, что я этого не заметил. Кроме того, это дало предупреждение «контроль до конца не-пустоты». Имо это действительно должно быть ошибкой компиляции. – devios1