Normally you do a check like that in a mutator method because you're working with objects that have to be release
d. Say you have a mutator method without that check:
- (void)setObject:(MyObject *)anObj
{
[obj release];
obj = [anObj retain];
}
Imagine (for some reason) you have a chunk of code like this that uses that method:
MyObject *o = [MyObject object]; // Auto-released
[anotherObject setObject:o];
[anotherObject setObject:o];
On Line 1, you can assume o
has a retain count of 0 (since it's autoreleased). On Line 2, o
has been passed to setObject:
, which retains it and stores it in the instance variable obj
. Since we're working with pointers, o
and obj
point to the same object in memory, which now has a retain count of 1.
On Line 3, you pass the same object to setObject:
again. But right away in that method, you release anObj
, which is the same object that both o
and obj
point to! This means that o
, obj
, and anObj
have a retain count of 0. When you set obj
to [obj retain]
, you're making obj
point to an object that has been released already.
This is obviously bad, so when working with mutator methods that deal with objects, you should always use that guard, which effectively checks to see if obj
and anObj
point to the same object in memory; if they do, nothing happens.
However, this guard isn't necessary in your example, because you're passing an int
-- not a pointer -- and int
s, of course, never get released (since they're not objects).