我们说我有一个未初始化的变量:
UIViewController *vc;
从这个变量中,我想引用UIViewController
,以便我可以在其上调用alloc
或new
来返回实例化对象。
基本上,我想这样做:
UIViewController *vc = [*typeof(vc) new];
...由于编译器需要表达式而不是类型,因此无法编译。
如果@encode
返回实际类型,我可以执行以下操作:
UIViewController *vc = [NSClassFromString(@(@encode(*typeof(vc)))) new];
...但是,@encode
返回' @',这只是"通用对象"。
我意识到它本质上有点哲学,但我厌倦了打字,并希望制作像NEW(x)
这样的宏。我也意识到如果涉及实际声明,可以制作类似的宏,但我对语法/角度不满意。
答案 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]
。