Protocol,Extension,Category的区别及使用

Category(分类/类目):

利用Objective-C的动态运行时分配机制,Category提供了一种比继承更为简洁的方法来对class进行扩展,无需常见对象类的子类就能为现有的类添加新方法,可以为任何已经存在的class添加方法,包括哪些没有源代码的类。

注意:

  • 无法向类中添加新的实例变量,类别没有位置容纳实例变量。(可用runtime方式实现添加实例变量);
  • 当类别中的方法与原始类方法名称冲突时,类别具有更高的优先级,类别方法取代初始方法从而无法使用原始方法。(方法加载顺序:父类->子类->分类,后加载覆盖前加载)
Protocol(协议):

类似C++中的虚类,java中的接口,不负责实现,只负责声明。其他子类继承该虚类,需要实现申明的方法。(常用场景:代理)

特点:协议多用在许多类使用相同的方法而且这些代码重复性很大的情况下,把这些重复的代码提炼出来放在一个协议中,供大家使用。类似于java中的接口与C++中的纯虚函数的抽象类,它提供协议的规则,使用者只有遵从了协议的规则才能使用它提供的方法。当然这些方法只是在协议中申明了,并没有具体的实现。当使用者遵从这个协议并使用它的方法是,如果在类声明文件中方法都是默认的或者是@required时,那么在类实现文件中必须全部地实现这些方法,如果是@option标记的,使用者可以选择性实现。

过程:它只有.h声明文件,它既可以作为一个单独的文件进行声明所提供的方法,也可以直接放在类声明文件中进行声明,一般采用后者进行声明。它的方法声明时有默认、@required、@optional三种情况。当使用前面两种时,在类实现文件中必须全部地实现这些方法。如果是@optional标记的,使用者可以选择性的实现,视情况而定。当它的方法没有@optional时,那么它就类似于接口中的abstract整个类是抽象的,是必须全部实现所有的方法的。

格式:

@protocol TestProtocol <NSObject>

///默认必须实现
- (void)getCount;

@required
///设置required  必须实现
- (void)getNum;

@optional
///设置optional  可选实现
- (void)getTitle;

@property (nonatomic,assign) int number;

@end

Extension(扩展):

匿名的Category(特殊的)。类有时需要一些只为自己所见,所用的私有实例及私有方法可以通过扩展的方式声明,定义的方法在类本身的@implementation代码区域中实现。与Category不同的地方:可增加私有属性,声明的方法必须实现。作用:将方法变为类的私有方法。(只有.h文件,可以添加是咧变量和方法)

顺便提下继承:

继承:

  • 特点: 继承多用于一般父类中的方法功能比较齐全,子类从父类继承过来使用,可以省略很多重复的代码,不仅简化了代码,而且也提高了代码的复用性。
  • 过程: 当子类需要的方法和属性在父类中找不到时,子类可以添加自己必要的方法和属性,目的是对功能进行扩充;当父类中有子类需要的方法,但是方法中内容并不能完成子类的需要时,子类可以重新实现这个同名的函数,它会覆盖父类的同名函数来实现子类的需要的内容。
其他场景:

Protocol 可以声明属性,当声明的属性在某个类中使用时需要使用关键字@synthesize 同步生成get 、set方法,否则不可用,如下是某个类遵守TestProtocol时用到number属性:

@synthesize number = _number;
- (int)getNumber{
    return 3;
}

- (void)setNumber:(int)number{
    _number = number;
}

匿名扩展若直接卸载类文件implementtation中,使用实例时无需使用@synthesize,若单独建立文件需要使用@synthesize,如下

@interface UIViewController ()

@property (nonatomic,assign) int extensionCount;

@end

@interface ViewController ()<TestProtocol>

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    
    self.extensionCount = 3;
    NSLog(@"extension中的属性时:%d",self.extensionCount);
}

@synthesize extensionCount = _extensionCount;

类继承同理,如果父类声明属性未同步实现get 、set方法,需要在子类使用时用到@synthesize。(场景:父类对某个属性声明@dynamic,在需要使用的时候,由子类去实现,符合runtime机制,动态加载)若父母未做限制,目前xcode版本无需使用@synthesize。如下:

@interface BaseViewController : UIViewController

@property (nonatomic,strong) NSString *tip;

@end


#import "BaseViewController.h"

@interface BaseViewController ()

@end

@implementation BaseViewController

@dynamic tip;

- (void)viewDidLoad {
    [super viewDidLoad];
}


@end


@interface ViewController : BaseViewController

@end

@implementation ViewController



- (void)viewDidLoad {
    [super viewDidLoad];
 
    self.tip = @"提示";
    NSLog(@"提示是:%@",self.tip);
}

@synthesize tip = _tip;
- (void)setTip:(NSString *)tip{
    _tip = tip;
}
- (NSString *)getTip{
    return _tip;
}
@end

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,839评论 6 482
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,543评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 153,116评论 0 344
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,371评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,384评论 5 374
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,111评论 1 285
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,416评论 3 400
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,053评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,558评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,007评论 2 325
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,117评论 1 334
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,756评论 4 324
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,324评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,315评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,539评论 1 262
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,578评论 2 355
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,877评论 2 345

推荐阅读更多精彩内容