2

When I am logging retain count with NSArray and NSString objects, I am having uneven behavior. See the code below,

NSArray *aryTemp = [NSArray arrayWithObjects:@"One",nil];
NSLog(@"Retain Count :%d",[aryTemp retainCount]);

NSArray *aryTemp2 = [[NSArray alloc] initWithObjects:@"One",nil];
NSLog(@"Retain Count :%d",[aryTemp2 retainCount]);

NSString *strTemp = @"One";
NSLog(@"Retain Count :%d",[strTemp retainCount]);

NSString *strTemp2 = [[NSString alloc] initWithString:@"One"];
NSLog(@"Retain Count :%d",[strTemp2 retainCount]);

And this is the output I am getting

2011-03-01 19:19:32.410 Test[14607:207] Retain Count :37
2011-03-01 19:19:32.412 Test[14607:207] Retain Count :1
2011-03-01 19:19:32.413 Test[14607:207] Retain Count :2147483647
2011-03-01 19:19:32.413 Test[14607:207] Retain Count :2147483647

What is the wrong with the code??

Thanks

Pratik Goswami

Pratik Goswami
  • 334
  • 1
  • 4
  • 15

4 Answers4

7

nothing wrong with 2147483647

2147483647 is INT_MAX. And INT_MAX is the retaincount for string literals (ie @"foo" strings defined in your code). This means they will never be released.

btw, don't use retainCount.

Matthias Bauch
  • 88,097
  • 19
  • 217
  • 244
  • I'd like to second this: The use of `retainCount` is not a good idea as it is an implementation detail and especially singletons and static objects will give you arbitrary values for the retain count (though most of the time it's simply INT_MAX). – DarkDust Mar 01 '11 at 14:48
  • OK, but why I am having garbage value for NSArray? I am getting retain count - 37. Why it is so? – Pratik Goswami Mar 02 '11 at 04:48
  • How do you know that 37 is a garbage value? That's exactly why you should not use retainCount. – Matthias Bauch Mar 02 '11 at 07:20
6

You should never use -retainCount, because it never tells you anything useful. The implementation of the Foundation and AppKit/UIKit frameworks is opaque; you don't know what's being retained, why it's being retained, who's retaining it, when it was retained, and so on.

Also see: StackOverflow | when to use retainCount for an excellent recount of why you don't use retainCount.

And to echo Dave DeLong: Please everyone go to http://bugreport.apple.com and request that -retainCount be deprecated. The more people that ask for it, the better.

Community
  • 1
  • 1
David Schaefgen
  • 800
  • 7
  • 9
4

retainCount returns NSUInteger and you should print it in this way ...

NSLog( @"%lu", (unsigned long)[blabla retainCount] );

%d is used for signed 32-bit integer (int). NSUInteger is on 32-bit platform defined as unsigned int and on 64-bit platform as unsigned long. Upper example is safe for both 32/64-bit platforms.

zrzka
  • 17,285
  • 5
  • 41
  • 68
4

What is the wrong with the code??

You are calling retainCount.

retainCount is next to useless for debugging and should never, ever, be used in production code. The retain count of an object is an internal implementation detail that will often be of a value that is unfathomable.

bbum
  • 160,467
  • 23
  • 266
  • 355