Итак, я родом из мира Java, где мы блаженно игнорируем проблемы управления памятью. По большей части ARC спас мою задницу, но вот что-то, что меня озадачило. В основном я использую NSInvocations для некоторых вещей, и я столкнулся с некоторыми неприятными проблемами памяти, прежде чем я сделал следующие модификации кода. Поскольку я сделал эти изменения, сбой памяти исчез, но я, как правило, очень боюсь кода, который я не понимаю. Правильно ли я это делаю?Вопросы NSInvocation и памяти
Перед: всякие проблемы с памятью:
NSInvocation *invocation = [NSInvocation invocationWithMethodSignature:[[target class] instanceMethodSignatureForSelector:selector]];
[invocation setSelector:selector];
[invocation setTarget:target];
[invocation setArgument:&data atIndex:2];
[invocation setArgument:&arg atIndex:3];
[invocation invoke];
NSString *returnValue;
[invocation getReturnValue:&returnValue];
После: Нет проблем с памятью, но я не уверен, что я получил это право:
NSInvocation *invocation = [NSInvocation invocationWithMethodSignature:[[target class] instanceMethodSignatureForSelector:selector]];
[invocation setSelector:selector];
[invocation setTarget:target];
[invocation setArgument:&data atIndex:2];
[invocation setArgument:&arg atIndex:3];
[invocation invoke];
CFTypeRef result;
[invocation getReturnValue:&result];
if (result)
CFRetain(result);
NSString *returnValue = (__bridge_transfer NSString *)result;
Edit:
I Just хотел добавить на основе ответа ниже, я использовал objc_msgSend, как таковой .:
NSString * returnValue = objc_msgSend(target, selector, data, arg);
И он решает все проблемы с памятью, а также выглядит намного проще. Прокомментируйте, если вы видите какие-либо проблемы с этим.
Это вряд ли будет правильным способом исправить вещи , но что такое селектор, и что конкретно были проблемы с памятью? –
Селектор - это простой метод для целевого класса. Принимает 2 объекта и возвращает строку. Проблемы различны - в основном плохой доступ. – user2453876