I've only been in the Objective-C & Cocoa world for a year, so I wasn't around when properties weren't automatically synthesized
Whenever I create new classes in our project, I can declare @property BOOL testFlag without declaring an instance variable.  Then, in the implementation, I could either call self.testFlag, [self testFlag], [self setTestFlag:NO].  But, I could also call _testFlag.  I always assumed because properties are automatically synthesized with instance variables, that's why I can just append a "_" underscore before the property name to directly access the instance variable.
However, I have been refactoring really old files, that clearly were created before auto-synthesizing was a thing
So now in the header, I'd see something like this:
@interface testClass 
{
  BOOL _testFlag
} 
@property BOOL testFlag;
In the implementation, there could be a custom setter/getter:
@implementation testClass
@synthesize testFlag = _testFlag;
-(void)setTestFlag:(BOOL)testFlag
{
  _testFlag = testFlag;
}
-(BOOL)testFlag
{
  return _testFlag;
}
But I thought because of auto-synthesizing, I could remove the _testFlag declaration in the header, and I could remove the @synthesize in the implementation.  But when I do this, there are just a truck ton of errors; wherever somebody was directly trying to access the ivar _testFlag. (This actually includes the custom getter/setter above ^^, too)
Is there perhaps something I am missing with the project settings that prevent this old file from generating an implied instance variable for properties?