(Fraction *) f is being introduced as an argument in the following "add" method:
-(void) add: (Fraction *) f;
In some other, hypothetical method, the argument represented by "f" could have been introduced as an integer:
-(void) otherMethod: (int) f;
But in this case, "f" needs to represent the class "Fraction" since it contains the two variables we want: (1) numerator and (2) denominator.
This is represented later, as you've pointed out, as f.numerator and f.denominator when calculating the new numerator and denominator. (Because when the "add" method accepts (Fraction *) f it's really accepting f.numerator and f.denominator.)
If you had called the argument another name, such as "xyz", then you would have to represent the two variables as xyz.numerator and xyz.denominator.
-(void) add: (Fraction *) xyz;
numerator = numerator * xyz.denominator + denominator * xyz.numerator;
denominator = denominator * xyz.denominator;
Does that help? If not, hopefully someone else can explain it better.