Можно ли получить информацию о объявленном типе переменной из переменной?
Нет. К тому времени, когда программа работает, эта информация теряется. В вашем случае newPage - это просто 32- или 64-битное число, указывающее на часть памяти, которая содержит объект Objective-C.
Я думаю, что ваша оригинальная версия unmacro'd является правильной вещью здесь:
assert([newPage isKindOfClass:[PageTopBottom class]]);
Это прекрасно документирует допущение, которое вы делаете, т. Е. Вы предполагаете, что newPage является экземпляром PageTopBottom или одним из его подклассов и абсолютно понятен любому, кто понимает Objective-C. Ваша версия макроса слегка запутывает то, что, если кто-то сталкивается с этим в коде, может поверить, что он утверждает, что newPage является PageTopBottom, а не одним из его подклассов (вы можете изменить имя макроса, чтобы предотвратить это, я полагаю, просто не стал бы беспокоиться).
Редактировать
То, что вы можете сделать, это объединить объявление и утверждение в одно:
#define DECLARE_AND_ASSERT_IS_KIND_OF_CLASS(T, V, I) T* V = (T*)(I); assert([(V) isKindOfClass: [(T) class])
который будет работать так:
DECLARE_AND_ASSERT_IS_KIND_OF_CLASS(PageTopBottom, newPage, [notification object]);