This is largely down to personal style and defensive programming. But here is the main reason why I personally use and have seen people use the prefix.
It is to do with making your intent clearer about whether you are accessing the ivar directly or using the getter/setter.
If I have:
@property (nonatomic, retain) NSArray *people;
and:
@synthesize people = _people;
This will compile and produce the getter/setter declarations like this:
- (void)setPeople:(NSArray *)people;
- (NSArray *)people;
Now to directly access the ivar I need to use:
_people
To use the getter/setter I can use dot notation or the getter/setter like:
[self people];
// or
self.people; // which compiles to [self people];
// and
[self setPeople:newPeople];
// or
self.people = newPeople; // which compiles to [self setPeople:newPeople];
Now in my code if I accidentally just type:
people = newPeople; // will not compile
it will not compile because I am not using the getter/setter and there is no ivar called people
it should be _people
.