iOS 協議的繼承和擴充套件

weixin_34413065發表於2017-07-29

參考文章:http://blog.csdn.net/u011363981/article/details/71499742

概述

在實際需求中,我們經常遇到需要擴充套件父類協議的情況,例如,當我們需要封裝一個擁有上拉載入和下拉重新整理功能的tableView時,我們希望擴充套件UITableViewDelegate中的方法,增加上拉載入和下拉重新整理的兩個回撥,這時我們就需要繼承UITableView的協議,並擴充套件兩個協議方法

實現

.h
#import <UIKit/UIKit.h>

@protocol TCTableViewDelegate <NSObject,UITableViewDelegate>

@end

@protocol TCTableViewDataSource <NSObject,UITableViewDataSource>

@end

@interface TCTableView : UITableView

@property (nonatomic, weak) id <TCTableViewDelegate> delegate;

@property (nonatomic, weak) id <TCTableViewDataSource> dataSource;

@end
.m
#import "TCTableView.h"

@implementation TCTableView

@dynamic delegate;

@dynamic dataSource;

@end

注意

當我們只實現了以下程式碼時


.h
#import <UIKit/UIKit.h>

@protocol TCTableViewDelegate <NSObject>

@end

@protocol TCTableViewDataSource <NSObject>

@end

@interface TCTableView : UITableView

@property (nonatomic, weak) id <TCTableViewDelegate> delegate;

@property (nonatomic, weak) id <TCTableViewDataSource> dataSource;

@end

會有兩個警告

1790850-b1da5e5b8ef6b966.png

1.第一個警告是因為delegate與父類中的屬性名衝突了,不做特殊處理的話,實現時會直接拿父類的的delegate,這樣的話這個delegate屬性就沒有遵循子類中的TCTableViewDelegate協議,在子類協議中的方法是無法被呼叫的
解決方案:

#import "TCTableView.h"

@implementation TCTableView

@dynamic delegate;

@dynamic dataSource;

@end

在.m檔案中用@dynamic關鍵字修飾delegate屬性,此關鍵字會阻止系統自動建立setter和getter方法,這樣就不會遵循系統邏輯直接去拿父類的delegate的實現了
更多關於@dynamic

2.第二個警告是因為子類沒有繼承父類的協議
解決方案:

@protocol TCTableViewDelegate <NSObject,UITableViewDelegate>

利用OC中協議可以多繼承的特性,使TCTableViewDelegate也繼承自UITableViewDelegate

demo

相關文章