Your problem is recursion. In the installer, you call the setter method over and over and over. When you announce
self.firstName = first name__;
basically equivalent
[self setFirstName:first name__]
Thus, the method calls the call itself, which does not make much sense.
First you need to wrap your head around properties and instance variables.
Class C object instances often contain instance variables that contain values. Although these variables can be exposed to the outside world through the @public classifier, this is not an established convention. The convention is to have properties that are behind the scenes a "wrapper" around a private instance variable. Since in Objective-C you can only communicate with other objects through messages in order to access the values โโof the instance variable, you have setter and getter methods that are called when the corresponding message is sent to this object.
The modern target C creates an instance variable for you implicitly when declaring properties. It is often said that these properties are supported by instance variables.
Usually there is no reason to explicitly implement setters and getters, since the compiler does this behind the scenes. (in the same way, it also creates these instance variables for you)
But if you want to explicitly implement setters, you need to set the instance variable in the customizer, and not call the setter itself (via the dot symbol), as I explained above.
Implicitly created instance variables have a naming convention with an underscore as a prefix. In your case, this is
_firstName
When you declare a property called firstName, you also get an instance variable
_firstName
You should look like this:
-(void)setFirstName:(NSString *)firstName { _firstName = firstName; }
And getter
-(NSstring *)getFirstName { return _firstName; }