Method Names in Objective-C

Apple’s Cocoa framework is well-known for its very long and descriptive method names. As an extreme example, take this method to initialize an NSBitmapImageRep instance with a specific bitmap format (only available on the Mac, not on iOS):

- (id)initWithBitmapDataPlanes:(unsigned char **)planes
                    pixelsWide:(NSInteger)width
                    pixelsHigh:(NSInteger)height
                 bitsPerSample:(NSInteger)bps
               samplesPerPixel:(NSInteger)spp
                      hasAlpha:(BOOL)alpha
                      isPlanar:(BOOL)isPlanar
                colorSpaceName:(NSString *)colorSpaceName
                  bitmapFormat:(NSBitmapFormat)bitmapFormat
                   bytesPerRow:(NSInteger)rowBytes
                  bitsPerPixel:(NSInteger)pixelBits

Objective-C (the language) aids Cocoa (the framework) in the quest for the longest method names of any framework with its syntax. The descriptive text for each argument before the colon is not a named parameter but a substantial part of the method signature itself. So the signature of the method above is:

initWithBitmapDataPlanes:pixelsWide:pixelsHigh:bitsPerSample:samplesPerPixel:hasAlpha:isPlanar:colorSpaceName:bitmapFormat:bytesPerRow:bitsPerPixel:

Descriptive, isn’t it? While virtually all methods in Cocoa and elsewhere adhere to this scheme, all the text describing the method arguments is actually optional in Objective-C. So the following method in the CAMediaTimingFunction class has a perfectly valid name:

+ (id)functionWithControlPoints:(float)c1x
                               :(float)c1y
                               :(float)c2x
                               :(float)c2y

Consequently, the selector for this method is:

functionWithControlPoints::::

Not pretty in my opinion, but doable. Now it gets really weird. If we can omit the text before the colon for the second and all additional arguments, why not leave out the text before the first argument, as well? It turns out we can do exactly that!

Believe it or not, these are valid method declarations:

- (void):(id)param;
- (void):(id)param1 :(id)param2;

And this is how you would send these messages to an object:

[myObject :obj1];
[myObject :obj1 :obj2];

Please don’t ever use this knowledge in your own code.

Update December 19, 2010: Incidentally, Stack Overflow user outis asked a very interesting question about message names in Obj-C the other day: Why must the last part of an Objective-C method name take an argument? The answers make an interesting read, and even the designer of Objective-C himself, Brad Cox, replied: I simply didn’t think of departing from Smalltalk’s keyword structure.