从未初始化的变量获取对类对象的引用 - 不是实例化的对象

时间:2014-09-07 18:17:28

标签: objective-c class variables typeof variable-types

我们说我有一个未初始化的变量:

UIViewController *vc;

从这个变量中,我想引用UIViewController,以便我可以在其上调用allocnew来返回实例化对象。

基本上,我想这样做:

UIViewController *vc = [*typeof(vc) new];

...由于编译器需要表达式而不是类型,因此无法编译。

如果@encode返回实际类型,我可以执行以下操作:

UIViewController *vc = [NSClassFromString(@(@encode(*typeof(vc)))) new];

...但是,@encode返回' @',这只是"通用对象"。

我意识到它本质上有点哲学,但我厌倦了打字,并希望制作像NEW(x)这样的宏。我也意识到如果涉及实际声明,可以制作类似的宏,但我对语法/角度不满意。

2 个答案:

答案 0 :(得分:0)

这里有我所拥有的......它看起来并不理想,因为它会影响性能。仍在寻找更好的答案。

static Class classFromEncoding(const char *encoding) {
    char *className = strndup(encoding + 1, strchr(encoding, '=') - encoding - 1);
    Class retval = NSClassFromString(@(className));
    free(className);
    return retval;
}

#define NEW(variable) [classFromEncoding(@encode(typeof(*variable))) new]

这是一个纯宏版本:

#define CLASS_FROM_VARIABLE(variable) \
^(const char *encoding) {             \
char *className = strndup(encoding + 1, strchr(encoding, '=') - encoding - 1); \
Class retval = NSClassFromString(@(className));      \
free(className);                         \
return retval;                              \
}(@encode(typeof(*variable)))

#define NEW(variable) [CLASS_FROM_VARIABLE(variable) new]
#define ALLOC(variable) [CLASS_FROM_VARIABLE(variable) alloc]

可以使用objc_getClass()或NSString initWithBytes进行变化,也许可以提高性能。不过,这不是一个无操作,这是我喜欢的。

答案 1 :(得分:-1)

根据您的需要[obj class][obj className]