1

I have been going back through my app trying to handle all the memory problems and reading up on memory management. I began using [object retainCount] to trace my memory allocation. Is this to be trusted because I keep finding the counts really strange?

Could someone explain the following:

Bear in mind this the app delegate and an empty mainViewController makes no difference. The initWithRootViewController is causing the count to go up, but I don't see another way of adding one....

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {      


/* Create the View Controllers */  
UIViewController *mainViewControl = [[[MainViewController alloc] init] autorelease];


/* Create the Navigation Controller */
UINavigationController *navigationController = [[[UINavigationController alloc] initWithRootViewController:mainViewControl] autorelease];


NSLog(@"retain count: %i",[mainViewControl retainCount]);

/* Set the toolbar to purple */
navigationController.navigationBar.barStyle = UIBarStyleBlackTranslucent;
navigationController.navigationBar.tintColor = [UIColor colorWithRed:.6 green:.1 blue:.4 alpha:0.4];
navigationController.navigationBar.translucent = YES;

NSLog(@"retain count: %i",[mainViewControl retainCount]);
navigationController.toolbar.barStyle = UIBarStyleBlackTranslucent;
navigationController.toolbar.tintColor = [UIColor colorWithRed:.6 green:.1 blue:.4 alpha:0.4];
navigationController.toolbar.translucent = YES;

[navigationController setNavigationBarHidden:YES animated:NO];
[navigationController setToolbarHidden:YES animated:NO];

NSLog(@"retain count: %i",[mainViewControl retainCount]);

[window addSubview:[navigationController view]];

NSLog(@"retain count: %i",[mainViewControl retainCount]);

And this is the log ~

2011-01-17 19:47:21.278 ANA[5653:207] 3
2011-01-17 19:47:21.282 ANA[5653:207] 4
2011-01-17 19:47:21.286 ANA[5653:207] 7
2011-01-17 19:47:21.287 ANA[5653:207] 12
2011-01-17 19:47:21.301 ANA[5653:207] Load View

I don't understand why changing those properties or referencing the navigationController is causing the retain count to shoot up.

I have done it without the autoreleases and manually released too but the result is the same. Basically I don't get it, and wonder if the retainCount command is reliable, because if I can't understand this, I don't think I can debug any memory issues elsewhere...

Ben
  • 1,565
  • 1
  • 10
  • 11
  • possible duplicate of [How many times do I release an allocated or retained object?](http://stackoverflow.com/questions/3730804/how-many-times-do-i-release-an-allocated-or-retained-object) – Brad Larson Jan 17 '11 at 16:08
  • While the question asked is different, the issue is the same between the two questions. – Brad Larson Jan 17 '11 at 16:09
  • It could well be, and I was searching for answers to this problem but it was hard to understand from what I found how it applied to me. The question really should be 'Can I trust [object retainCount]' and the answer being so nice and clearly 'No'! Admittedly I didn't find your link. – Ben Jan 18 '11 at 00:37

1 Answers1

7

As stated in the official documentation for -retainCount,

Important: This method is typically of no value in debugging memory management issues. Because any number of framework objects may have retained an object in order to hold references to it, while at the same time autorelease pools may be holding any number of deferred releases on an object, it is very unlikely that you can get useful information from this method.

Don’t rely on -retainCount. Other objects may be retaining your object without you knowing it, and autoreleased objects might give you a wrong impression of the actual retain count.

You can rely on Apple’s framework objects to do the right thing and relinquish ownership of your object when appropriate, and you need to make sure you are doing that as well.

  • 3
    Apple should just make Xcode spit warnings on attempting to use `retainCount` or something. – BoltClock Jan 17 '11 at 11:34
  • 1
    I'm surprised you beat Bill Bumgarner to this one. I think he has **Do not use -retainCount.** as a text macro now: http://stackoverflow.com/questions/3730804/how-many-times-do-i-release-an-allocated-or-retained-object/3730835#3730835 – Brad Larson Jan 17 '11 at 16:07
  • @Brad Haha, brilliant! I like his use of a Markdown header, heh. =) –  Jan 17 '11 at 16:13
  • Thank you! That was really freaking me out. I was studying all the memory management information but when using retainCount to test what I was learning it utterly sent me for a spin. Without being able to confirm what I was learning I felt unable to clean up my code. – Ben Jan 17 '11 at 23:53