12

I'm evaluating the switch to ARC (automatic reference counting) and the refactoring to apply to my code. Among the things I have to figure out, there is this:

what should I do in didReceiveMemoryWarning if the explicit release of objects is not allowed by ARC? Currently, I use that method to release objects belonging to my controller and that are easily retrievable via lazy getters:

- (void)didReceiveMemoryWarning {
    [_foo release]; _foo = nil;
    [super didReceiveMemoryWarning];
}

and the relative lazy getter:

- (Foo *)foo {
    if (_foo) {
        return _foo;
    }
    return (_foo = [[Foo alloc] init]);
}

It seems impossible to implement such "pattern" in ARC… so, what should I do? Should didReceiveMemoryWarning be considered "deprecated"/useless in ARC?

Peter Hosey
  • 95,783
  • 15
  • 211
  • 370
daveoncode
  • 18,900
  • 15
  • 104
  • 159

2 Answers2

20

ARC handles the retain and release code so setting _foo to be nil is sufficient to allow the ARC generated code to perform the release. You don't explicitly release, you simply manage your object graph and the ARC generated code will perform the release when appropriate.

Read Apple's Transitioning To ARC Release Notes document for more information.

Joe Masilotti
  • 16,815
  • 6
  • 77
  • 87
ditkin
  • 6,774
  • 1
  • 35
  • 37
0

You can do several things, but all are app-specific. Things like clearing arrays and dictionaries and setting object references to nil (ARC's way of deleting objects).

Cthutu
  • 8,713
  • 7
  • 33
  • 49