You should use _object only if you are overriding getter/setter methods. "_object =" just assigns while "self.object =" calls its setter method. You must use _object to prevent and managing retain count using setter methods. Check the difference between by writing code:
@property (nonatomic, retain) NSMutableArray *arr;
//=============Accessing with _object==========
NSLog(@"Retain Count before Allocation => %lu", (unsigned long)_arr.retainCount);
_arr = [NSMutableArray arrayWithArray:@[@"arrobj1", @"arrObj3"]];
NSLog(@"Retain Count before Allocation => %lu", (unsigned long)_arr.retainCount);
_arr = [[NSMutableArray alloc] init];
NSLog(@"Retain Count After alloc+init => %lu", (unsigned long)_arr.retainCount);
//============================================
Output is :
Retain Count before Allocation => 0
Retain Count before Allocation => 1
Retain Count After alloc+init => 1
###### And also with accessing objects with self.object#######
//=============Accessing with _object==========
NSLog(@"Retain Count before Allocation => %lu", (unsigned long)self.arr.retainCount);
self.arr = [NSMutableArray arrayWithArray:@[@"arrobj1", @"arrObj3"]];
NSLog(@"Retain Count before Allocation => %lu", (unsigned long)self.arr.retainCount);
self.arr = [[NSMutableArray alloc] init];
NSLog(@"Retain Count After alloc+init => %lu", (unsigned long)self.arr.retainCount);
//============================================
Output is:
Retain Count before Allocation => 0
Retain Count before Allocation => 2
Retain Count After alloc+init => 2
I hope this will helps you.