Understanding Protocol Inheritance in Objective-C
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>
.
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, 2022Comments
-
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 almost 14 yearsThank 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.