Как вернуть значение структуры из метода класса, определенного во время выполнения, в 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);

Это объясняет мне ошибки компилятора, но что я использую на уровне времени выполнения для вызова класса и его статического метода во время выполнения и возврата значения структуры?

Ответы на вопрос(2)

Ваш ответ на вопрос