When to use a colon with a @selector

You seem to be missing one concept here: colon is, in some way, a part of the method name. E.g., method

-(IBAction) doIt:(id)sender;

has name doIt:. Thus, colon should be used to reference this method.
But this method doesn't have a colon at the end

-(IBAction) doItWithoutParameter;

Same goes for methods accepting multiple arguments, they have names like doItWithParam1:andParam2:


As mentioned by boltClock, the character you are referring to is actually a colon. The difference between @selector(method) and @selector(method:) is the method signature. The 2nd variant expects a parameter to be passed.

@selector(method) would expect the method: -(void)method

@selector(method:) would expect the method: -(void)method:(id)someParameter


A selector represents a method name, and the number of colons in a selector matches the number of arguments in the corresponding method:

  1. mySelector — no colon, no arguments, e.g. - (void)mySelector;, [self mySelector];
  2. mySelectorWithFoo: — one colon, a single argument, e.g. - (void)mySelectorWithFoo:(Foo *)foo;, [self mySelectorWithFoo:someFoo];
  3. mySelectorWithFoo:withBar: — two colons, two arguments, e.g. - (void)mySelectorWithFoo:(Foo *)foo bar:(Bar *)bar;, [self mySelectorWithFoo:someFoo bar:someBar];

and so forth.

It is also possible to have a selector without ‘naming’ the parameters. It’s not recommended since it’s not immediately clear what the parameters are:

  1. mySelector:: — two colons, two arguments, e.g. - (void)mySelector:(Foo *)foo :(Bar *)bar;, [self mySelector:someFoo :someBar];
  2. mySelector::: — three colons, three arguments, e.g. - (void)mySelector:(int)x :(int)y :(int)z;, [self mySelector:2 :3 :5];