31

In updating some of my code to be in compatible with the iOS 5 SDK, I attempted to refactor my code by using "Convert to Objective-C ARC" in Xcode and received an error. The error occurs on an instance variable in my .h file.

NSError **_error;

The error says "Pointer to non-const type 'NSError *' with no explicit ownership." How might I fix this?

Ziminji
  • 1,286
  • 1
  • 14
  • 18
  • This question (see http://stackoverflow.com/questions/6907726/setting-nserror-within-a-block-using-arc) is the closest thing I can find on the subject. – Ziminji Oct 18 '11 at 12:14
  • 1
    Why are you using double indirection in an instance variable? You should only need that for method parameters so that NSErrors can be passed back up. – Brad Larson Oct 18 '11 at 14:37
  • @BradLarson ok, so what's the correct way (in ARC) to initialize an `NSError` instance when calling a method that takes `(NSError**):error` as an argument? – raffian Sep 23 '12 at 18:01
  • @SAFX - Same as you did before ARC, `NSError *error = nil;` and then you'll just pass `&error` into your method. – Brad Larson Sep 24 '12 at 14:54

2 Answers2

60

You can use one of the lifetime qualifiers described in the Transitioning to ARC Release Notes

For NSError ** you'd use __autoreleasing so the example provided by Nikolai would then look like this

@interface Foo : NSObject
{
    NSError * __autoreleasing *error;
}

The syntax is a little weird and you should follow Nikolais advice, but if you're sure NSError ** is what you want this should work.

John Conde
  • 217,595
  • 99
  • 455
  • 496
tapi
  • 1,726
  • 1
  • 16
  • 16
18

When storing NSError objects in an instance variable you have to declare it as a simple pointer:

@interface Foo : NSObject
{
    NSError *_errror;
}

NSError ** is only used to indirectly return NSError objects from a method to the caller. It is (probably) an error to store it in an instance variable.

Nikolai Ruhe
  • 81,520
  • 17
  • 180
  • 200