objective-cpropertiessynthesize

What are the circumstances that cause a @property to not automatically create an instance variable?


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?


Solution

  • Remove the getter and setter to have automatic synthesis of the backing variable. When you supply both for the property, the assumption is that you're going to look after storage yourself.