mshafrir
mshafrir

Reputation: 5230

Explanation of Cocoa @selector usage

I'm new to Cocoa/Cocoa Touch, and working through a development book. I've come across situations where the @selector() operator is used. I'm a bit lost on how and when the @selector() operator should be used. Can someone provide a short and sweet explanation and example of why it's used and what benefit it gives the developer?

By the way, here is sample code taken from Apple's iPhone development site that uses @selector()

if ([elementName isEqualToString:@"entry"])
{

    parsedEarthquakesCounter++;

    // An entry in the RSS feed represents an earthquake, so create an instance of it.
    self.currentEarthquakeObject = [[Earthquake alloc] init];
    // Add the new Earthquake object to the application's array of earthquakes.
    [(id)[[UIApplication sharedApplication] delegate]
            performSelectorOnMainThread:@selector(addToEarthquakeList:)
            withObject:self.currentEarthquakeObject waitUntilDone:YES];
    return;
}

Upvotes: 24

Views: 26408

Answers (6)

Gajendra Rawat
Gajendra Rawat

Reputation: 3663

You can use a selector to invoke a method on an object—this provides the basis for the implementation of the target-action design pattern in Cocoa.

[myObject performSelector:@selector(runMYmethod:) withObject:parameters];

is equivalent to:

[myObject runMYmethod:parameters];

Upvotes: 0

user23743
user23743

Reputation:

One reference to look at:

http://en.wikipedia.org/wiki/Multiple_dispatch

Upvotes: 2

Petteri H
Petteri H

Reputation: 12262

One practical example is validateMenuItem method where menu items are identified with their target actions.

Simplified example:

- (BOOL)validateMenuItem:(NSMenuItem *)item {
    if ([item action] == @selector(selectFiles:) && otherCondition) {
        return YES;
    } else {
        return NO;
    }
}

Upvotes: 2

Brad Larson
Brad Larson

Reputation: 170317

In addition to what's been said, you can also wrap up the @selector in an NSInvocation for later use. You can set the arguments to the NSInvocation a long time after it's created, and activate it when you need the message to be fired. This gives you a lot of power.

For an introduction to the concept, Scott Stevenson has a great post entitled "Dynamic Objective-C with NSInvocation".

Upvotes: 4

mouviciel
mouviciel

Reputation: 67919

@selector() is used each time you need to pass the name of a method as an argument to another method, a function or as a variable value. Passing directly the name doesn't work in objective-C.

Upvotes: 2

Andrew Grant
Andrew Grant

Reputation: 58804

The selector operator provides a way to refer to a method provided by an object, somewhat similar to a function pointer in C. It is useful because it allows you to decouple the process of calling methods on an object. For example one piece of code could provide a method, and another piece of code could apply that method to a given set of objects.

Examples:

Test to see if an object implements a certain method:

[object respondsToSelector:@selector(methodName)]

Store a method to later call on an object;

SEL method = @selector(methodName);
[object performSelector:method];

Call a method on a different thread (useful for GUI work).

[object performSelectorOnMainThread:@selector(methodName)]

Upvotes: 40

Related Questions