Understanding Protocol Inheritance in Objective-C

10,179

Think of it more as composition rather than inheritance.

@protocol UITableViewDelegate<NSObject, UIScrollViewDelegate> defines a protocol that includes all the methods of the NSObject protocol, the UIScrollViewDelegate protocol, as well as any methods defined for the UITableViewDelegate protocol. When you subclass and create a new property, you're overriding the type of the superclasses property. To make this work how I think you want, you should declare View2Delegate as @protocol View2Delegate <NSObject, View1Delegate>.

Share:
10,179
Mustafa
Author by

Mustafa

I'm a Manager Development/Project Manager/Team Lead/Mobile Application Developer located in Islamabad, Pakistan, working for BroadPeak Technologies. I'm currently focusing on managing and developing mobile applications for Android and iOS devices; with hands on experience developing iOS applications. More information.

Updated on June 05, 2022

Comments

  • Mustafa
    Mustafa about 2 years

    I'll appreciate if anyone can explain the logic behind protocol inheritance. e.g. what does the following mean (UITableView.h):

    @protocol UITableViewDelegate<NSObject, UIScrollViewDelegate> 
    

    The following class implementation doesn't work. I have a class View1 (which inherits UIView), with an associated protocol. I have another class, View2 (which inhertits View1). Now i want to inherit the the protocol as well. Can anyone please point me in the right direction.

    Class 1:

    @protocol View1Delegate;
    
    @interface View1 : UIView {
        id <View1Delegate> delegate;
        // . . .
    }
    
    @property (nonatomic, assign) id <View1Delegate> delegate; // default nil. weak reference
    
    @end
    
    @protocol View1Delegate <NSObject>
    - (void)View1DelegateMethod;
    @end
    
    @implementation View1
    
    @synthesize delegate;
    
    // . . .
    @end
    

    Class 2:

    @protocol View2Delegate;
    
    @interface View2 : View1 {
        id <View2Delegate> delegate;
        // . . .
    }
    
    @property (nonatomic, assign) id <View2Delegate> delegate; // default nil. weak reference
    
    @end
    
    @protocol View2Delegate <NSObject>
    - (void)View2DelegateMethod;
    @end
    
    @implementation View2
    
    @synthesize delegate;
    
    // . . .
    @end
    
  • Mustafa
    Mustafa almost 14 years
    Thank you for your reply. I'm declaring the protocol as you've mentioned, but the problem i'm facing is with the declaration of id <...>delegate; In View1, I have id <View1Delegate> delegate; with it's associated @property and @synthesize. Since i'm inheriting View1 in View2, when i declare id <View2Delegate> delagete; with it's associated @property and @synthesize, i get an error: "Property 'delegate' attempting to use ivar 'delegate' declared in super class of 'View2'. What's the correct way to handle this situation. Please see the sample classes i've posted above.