Reputation: 21517
So yeah, I'm a Java guy in this crazy iPhone world. When it comes to memory management I stiill don't have a very good idea of what I'm doing.
I have an app that uses a navigation controller, and when it's time to go on to the next view I have code that looks like this:
UIViewController *myController = [[MyViewController alloc] initWithNibName:@"MyView"
bundle:[NSBundle mainBundle];
[[self navigationController] pushViewController:myController animated:YES];
Now according to Apple's fundamental rule on memory management
You take ownership of an object if you create it using a method whose name begins with “alloc” or “new” or contains “copy” (for example,
alloc
,newObject
, ormutableCopy
), or if you send it aretain
message. You are responsible for relinquishing ownership of objects you own usingrelease
orautorelease
. Any other time you receive an object, you must not release it.
To me that means that I should be releasing myController
, or giving it an autorelease
message. But, whenever I try doing that my application winds up crashing as I push and pop views off of the stack.
This didn't smell right to me, but in running Instruments it claims that I don't have any memory leaks.
So I my question is
Upvotes: 6
Views: 4413
Reputation: 18556
@Ben Gottlieb why do you need to autorelease before pushing it? Retain count at object allocation is 1, autorelease before or after pushing doesn't affect the retain count, though generally autoreleasing as a matter of style is applied afer object alloc/init:
[[[object alloc] init] autorelease];
@bpapa,
2) When pushing, the navigation controller will retain the view controller. Later when this view is popped off the navigation controller stack, the navigation controller will release it.
3) Unless there's a explicit reason to hold onto that view no you should not assign it to an instance variable. In general you want your views to exist only as long as you need them.
Upvotes: 3
Reputation: 85542
The problem is (most likely) you're releasing your viewController before the Navigation Controller has a chance to claim ownership. There are two ways around this:
-release
your controller after pushing it to the Nav Controller-autorelease
your controller before pushing it. If you do this, the active NSAutoreleasePool (which you don't need to worry about) will take care of releasing your controller at a later time.Upvotes: 9