2

I have read that objects retain count and that it can be increased when we assigned a second value (or object).

Can anybody give me an idea about the basic conditions where retainCount increases or decreases (without retain , alloc and release)...

benRollag
  • 1,219
  • 4
  • 16
  • 21
Ranjeet Sajwan
  • 1,925
  • 2
  • 28
  • 60

3 Answers3

3

Short answer: no.

Slightly longer one:

Actions on your part that are typically expected to modify the retain count are retain, release, autorelease and calling methods whose name contains new or copy. In some instances, however, they might not do so, for good implementation reasons, but do something else instead. And there are many other things you can do, like adding objects to collections, that may modify the retain count in ways that are just not your business.

Do not use or rely on retain counts. They are an implementation detail. Your concern is to manage your own ownership, which you do via the semantics of the above-mentioned methods. How that affects the retain count beneath the hood is something you are better off not even looking at.

Please just don't.

Being concerned about retain count is almost always a way to cause bugs, not cure them.

walkytalky
  • 9,453
  • 2
  • 36
  • 44
  • 2
    `autorelease` does not alter the retain count. – JeremyP Nov 23 '10 at 11:07
  • To clarify: what alters the retain count is the drain or release of the autoorelease pool that autorelease puts the object in. – JeremyP Nov 23 '10 at 11:08
  • @Jeremy: true, and actually I did start an edit that would have clarified that and a few other details, but I lost the will to live before finishing it. – walkytalky Nov 23 '10 at 17:07
3

The retain count of an object is an implementation detail that you shouldn't worry about. You should really only concern yourself with when you gain and lose ownership of an object. Here's why:

+alloc returns an object with a retain count of 1. However, you immediately send it an init message which might give you back a completely different object. For instance

NSString* foo = [[NSString alloc] initWithString: @"foo"];

Gives you an object with a retain count of 1, right? Wrong on current implementations of Cocoa. The string returned by +alloc is immediately released and instead a reference to @"foo" is returned. The retain count of @"foo" is INT_MAX.

Retaining an object increases its retain count, right? Probably, but again sending retain to constant strings has no effect and some singletons have a nul implementation of retain too.

Similarly release usually has an effect on the retain count, but again not necessarily for the same reasons.

Sending copy should give you a new object with a retain count of 1 right? Wrong. Immutable objects can implement copy by sending themselves retain and then returning themselves. In most cases, that will add one to the retain count, but of course with string constants, nothing happens.

If you just think in terms of retaining and releasing ownership all of that stuff I have just said becomes irrelevant implementation details.

JeremyP
  • 84,577
  • 15
  • 123
  • 161
2

retainCount of an object changes in the following cases:

  • When you create an object(new or alloc, copy or mutablecopy), it has a retain count of 1.

  • When you send an object a retain message, its retain count is
    incremented by 1.

  • When you send an object a release message, its retain count is
    decremented by 1.

  • When you send a autorelease message to an object, its retain count will be decremented by 1(not
    immediately as in case of release but some time in the future)

You can view this post to get a detailed info on how memory management works in iPhone.

RK-
  • 12,099
  • 23
  • 89
  • 155