Как вернуть значение структуры из метода класса, определенного во время выполнения, в ARC?
У меня есть метод класса, возвращающийCGSize
и я хотел бы вызвать его через функции времени выполнения Objective C, потому что мне даны имена классов и методов в виде строковых значений.
Я компилирую с флагами ARC в XCode 4.2.
Подпись метода:
+(CGSize)contentSize:(NSString *)text;
Первым делом я попытался вызвать егоobjc_msgSend
нравится:
Class clazz = NSClassFromString(@"someClassName);
SEL method = NSSelectorFromString(@"contentSize:");
id result = objc_msgSend(clazz, method, text);
Это завершилось с «EXC_BAD_ACCESS» и без трассировки стека. Я использовал это сначала, потому что документация дляobjc_msgSend
говорит,
Когда он сталкивается с вызовом метода, компилятор генерирует вызов одной из функцийobjc_msgSend
, objc_msgSend_stret
, objc_msgSendSuper
, или жеobjc_msgSendSuper_stret
, [...] Методы, которые имеют структуры данных в качестве возвращаемых значений, отправляются с использованиемobjc_msgSendSuper_stret
а такжеobjc_msgSend_stret
.
Далее я использовалobjc_msgSend_stret
нравится:
Class clazz = NSClassFromString(@"someClassName);
SEL method = NSSelectorFromString(@"contentSize:");
CGSize size = CGSizeMake(0, 0);
objc_msgSend_stret(&size, clazz, method, text);
Использование подписи выше дает мне следующие две ошибки компилятора и два предупреждения:
ошибка: автоматический подсчет ссылок Проблема: неявное преобразование типа указателя не Objective-C 'CGSize *' (он же struct CGSize * ') в' id 'запрещено с помощью ARC
предупреждение: семантическая проблема: несовместимые типы указателей, передающие «CGSize *» (он же «struct CGSize *») параметру типа «id»
ошибка: автоматический подсчет ссылок Проблема: неявное преобразование указателя Objective C в «SEL» запрещено с ARC
предупреждение: семантическая проблема: несовместимые типы указателей, передающие класс __unsafe_unretained классу параметра типа SEL
Если я смотрю на объявление метода, это:
OBJC_EXPORT void objc_msgSend_stret(id self, SEL op, ...)
__OSX_AVAILABLE_STARTING(__MAC_10_0, __IPHONE_2_0);
который идентиченobjc_msgSend
:
OBJC_EXPORT id objc_msgSend(id self, SEL op, ...)
__OSX_AVAILABLE_STARTING(__MAC_10_0, __IPHONE_2_0);
Это объясняет мне ошибки компилятора, но что я использую на уровне времени выполнения для вызова класса и его статического метода во время выполнения и возврата значения структуры?