Objective-C: Overriding Getter & Setter with Instance Variable (using _)

Viewed 7551

I'm learning the Swift programing language and during this I sometimes get in touch with the old Objective-C programming language and its code.

I'm an absolutely beginner and therefore I have some question for better understanding the Setter and Getter.

So, I know that I can create an instance variable through curly braces in the .h file but normally I use properties. These properties are backed by an instance variable and offer automatically a Getter and Setter Method.

Example:

Vehicle .h file:

@interface Vehicle : NSObject 
@property int myProperty;
@end

Because I created this property I don't have to declare a Getter and Setter method in the vehicle.m file because they are automatically created by the compiler. So I can create a vehicle-object, set and get the value.

Example

main.m

Vehicle *myvehicle = [[vehicle alloc] init];
[myvehicle myProperty] // myvehicle.myProperty
[myvehicle setMyProperty : 10] // myvehicle.myProperty = 10;

Now I read that it is possible to override the automatically created Getter and Setter method of my created property "myProperty". When declaring my own version of the Getter and Setter I have to declare two methods in the vehicle.h and vehicle.m file. In the vehicle.m file I don't call the object by using the self keyword but by using it's automatically created instance variable (_myProperty). Is it right?

I tried it but alway get an error and I don't know why and what is the point.

Example

Vehicle .h file:

@interface Vehicle : NSObject 
@property int myProperty;
-(int) myProperty; //my new Getter method
-(void) setMyProperty: (int)updatedMyProperty; //My new Setter method
@end

vehicle .m file:

    @implementation Vehicle

    -(int) myProperty {
      if (! _myProperty) {
        _myProperty = NO;
    }
      return _myProperty;
    }

   -(void) setMyProperty: (int)updatedMyProperty {
    if (_myProperty == updatedMyProperty) return;
    _myProperty = updatedMyProperty;
    }
    @end

I always get the error "Use of undeclared identifier" and I don't know why. If I understand right I don't have to declare the ivar or its name using @synthesize because the compiler automatically creates the ivar called _myProperty for me. I just have to use @synthesize when I want to change the ivar's name.

I'm not sure why I get stuck and what the point is. Could you explain it? Thanks in advance!

1 Answers
Related