NSInvocation and ARC (Automatic Reference Counting)
Asked Answered
G

2

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?

Glance answered 10/1, 2012 at 22:31 Comment(0)
M
10

This might work;

__unsafe_unretained NSString *one = @"Hello World";
Mediatorial answered 10/1, 2012 at 22:37 Comment(2)
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...Outlander
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!Haiphong
P
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.

Pastypat answered 10/8, 2012 at 17:57 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.