I\'m currently learning myself objective-c and iOS programming and found myself stuck with non-working code due to this subtle error for an hour. Consider the following code
A method declare like the one you posted is rare (and poor style, imo). Objective-C is supposed to be verbose. Methods break down like this:
-
or +
. -
means it is an instance method, +
means it is a class method.(NSString *)
.:
in it. Such as - (void) reload;
This would be a method that doesn't return a value and takes no parameters. - (NSString *) reverseString:(NSString *) stringToReverse;
In this example your method name would be reverseString:
it takes one parameter, an NSString*
that will be called stringToReverse
in the method definition.:
with no type it will be a case like - (float) addThreeValues:::
This method returns a float and takes 3 parameters. This would be an appropriate definition because the three values don't matter what order they are provided because we are just adding them.The method signature - (NSString *):name
breaks down to the following:
-
It is an instance method (versus a class method with a +
).(NSString *)
It returns a string.:
If you were to speak the name of this method, it would simply be called "colon". :
tells the compiler that your method accepts one parameter as well.name
There is a parameter called name. When you don't specify a type, the compiler assumes you meant id
, so this method actually fleshes out to be - (NSString *):(id)hello
A valid call to this method would be: [self :@"hello"]
.
You can do really weird things because :
is a valid name for a method, and the compiler assumes id
. You could, if you really wanted to, have a method called - :::
. The compiler would assume you meant - (id):(id):(id):(id)
, a method that returns an object of type id
and takes three parameters of type id
. You'd call it like so: [self :@"hello" :anObject :myObject];