Print Shortlink

Plain Old Objective-C class – IV

The equivalent of interfaces in Java and C# in Objective-C are the Protocols and not the @interface that you use to declare the methods and variables. A protocol is defined using @protocol directive. It can have mandatory and optional members. A class needs to implement the mandatory methods declared in the protocol, if the “interface” of the class follows it. A simple protocol Shape with area and draw methods is shown below.


@protocol Shape <NSObject>
    @required
    -(NSInteger) area;

    @optional
    -(void) draw;
@end

As you can Shape is a protocol with area and draw methods. Shape protocol itself conforms to NSObject protocol.

Let’s create an interface Circle that uses the Shape protocol as shown below.

#import "Shape.h"

@interface Circle : NSObject<Shape> {
    NSInteger radius;
}
@property NSInteger radius;
@end

Circle interface inherits NSObject and follows the Shape protocol. The protocol list is specified within the angular brackets < >. The Circle implementation is shown below

#import "Circle.h"

@implementation Circle
    @synthesize radius;

-(NSInteger)area{
    return 3.14 * radius * radius;
}

//optional
-(void)draw{
    NSLog(@"Drawing circle");
}
@end

Circle implementation needs to implement the area method, though the draw method is optional. The main function is shown below.

int main (int argc, const char * argv[])
{
    Circle *circle = [Circle alloc];
    circle.radius = 22;
    NSLog(@"Area: %ld",[circle area]);
   if([circle conformsToProtocol:@protocol(Shape)])
       NSLog(@"Circle conforms to Shape protocol");
}

We have created a Circle object and also used the conformsToProtocol method that checks if circle object conforms to Shape protocol. It’s easier to understand protocols if you have worked with interfaces in Java/.NET languages.

Leave a Reply