Скажем, у меня есть неинициализированный переменную:Получить ссылку на объект класса из неинициализированной переменной - не экземпляр объекта
UIViewController *vc;
С этой переменной, я хочу, чтобы ссылаться на UIViewController
, так что я мог бы назвать alloc
или new
на чтобы вернуть экземпляр объекта.
По существу, я хочу сделать:
UIViewController *vc = [*typeof(vc) new];
... который не компилируется, поскольку компилятор ожидает выражение, а не тип.
Если @encode
вернулся фактический тип, я мог бы сделать что-то вроде:
UIViewController *vc = [NSClassFromString(@(@encode(*typeof(vc)))) new];
... однако, @encode
возвращает '@', который просто означает "общий объект".
Я понимаю, что это немного философский характер, но я устал печатать и хотел бы сделать макрос, как NEW(x)
. Я также понимаю, что аналогичный макрос можно сделать, если он включает в себя фактическое объявление, но я не удовлетворен этим синтаксисом/углом.
'#define NEW (класс, varname) class * varname = [class new]' неудовлетворительно, вы говорите? –
Да. Я придумал что-то (см. Мой ответ), но это не удивительно. Я, вероятно, не сделаю этого. – xtravar
Аналогичная проблема, но не идентична, потому что у вас все еще есть доступ к локальному объявлению: [ObjC вы можете проверить неинициализированный указатель на статический тип класса?] (Http://stackoverflow.com/q/7680310) Это объясняет, почему это не " t вообще возможно, однако. –