9

When trying to migrate my current code to ARC, I'm getting errors whenever I pass an NSString as an NSInvocation argument.

Example:

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

The error happens when I use the Refactor -> Convert to Objective-C ARC option from the Edit menu. The text is "NSInvocation's setArgument is not safe to be used with an object with ownership other than __unsafe_retained."

How would I get around this?

Abizern
  • 146,289
  • 39
  • 203
  • 257
Anonymous
  • 1,750
  • 3
  • 16
  • 21

2 Answers2

10

This might work;

__unsafe_unretained NSString *one = @"Hello World";
Abizern
  • 146,289
  • 39
  • 203
  • 257
  • 3
    This will work, but you have to be VERY careful with the memory handling on this. I would recommend not using NSInvocation anymore if you can avoid it... – Joshua Weinberg Jan 10 '12 at 22:53
  • 1
    I am using OCMock, and it passes an NSInvocation object into its callback blocks. If you don't use __unsafe_unretained on all the parameters ARC gets very unhappy. So thanks for the tip, mysterious crashes gone! – phatmann May 22 '14 at 20:39
5

As Joshua Weinberg commented, using NSInvocation is not recommended anymore. If you have up to two parameters you can use performSelector. For three parameters or more, you can use NSObject's -methodForSelector: as explained here.

Community
  • 1
  • 1
Yoav
  • 5,962
  • 5
  • 39
  • 61