2012-01-10 2 views
8

При попытке перенести мой текущий код в ARC, я получаю ошибки всякий раз, когда передаю NSString как аргумент NSInvocation.NSInvocation и ARC (автоматический подсчет ссылок)

Пример:

NSInvocation inv = ...; 
NSString *one = @"Hello World!"; 
[inv setArgument:&one atIndex:2]; 

ошибка происходит, когда я использую Refactor -> Преобразовать в Objective-C вариант ARC в меню Edit. Текст: «Набор атрибутов NSInvocation не является безопасным для использования с объектом с собственностью, отличным от __unsafe_retained».

Как мне обойти это?

ответ

10

Это может сработать;

__unsafe_unretained NSString *one = @"Hello World"; 
+3

Это будет работать, но вы должны быть ОЧЕНЬ осторожны с обработкой памяти на этом. Я бы рекомендовал не использовать NSInvocation больше, если вы можете избежать этого ... –

+1

Я использую OCMock, и он передает объект NSInvocation в свои блоки обратного вызова. Если вы не используете __unsafe_unretained по всем параметрам, ARC становится очень несчастным. Так что спасибо за подсказку, таинственные аварии исчезли! – phatmann

5

Как сказал Джошуа Вайнберг, использование NSInvocation больше не рекомендуется. Если у вас есть до двух параметров, вы можете использовать функцию performSelector. Для трех параметров или более, вы можете использовать NSObject -methodForSelector:, как описано here.

Смежные вопросы