Objective-C类别和协议

这一章的讲解最好能够对比代码,我将代码放在了github上:
https://github.com/mymdeep/OC_foundation
需要的朋友可以参考一下

类别

在程序的开发过程中,经常会遇到这类情况,例如,我们在使用NSString的时候,需要NSString能够多一些自己需要的方法,比如获取字符串的长度转化成NSNumber类,或者使用UIImage的时候,我们能够增加一个自己需要的压缩方法。
要想实现上述功能,有两种方法,第一种是新写一个类,继承NSString,但是这样创建子类会非常复杂,而且你所使用的所有文件都依赖的是NSString,这样替换也会非常麻烦。
这时可以考虑使用第二种方式,就是类别的方式。

声明

#import <Foundation/Foundation.h>
@interface  NSString(NumberConvenience)
-(NSNumber *)lengthAsNumber;
@end//NumberConvenience
@implementation NSString(NumberConvenience)
-(NSNumber *)lengthAsNumber
{
    unsigned int length = [self length];
    return ([NSNumber numberWithUnsignedInt : length]);
}  //lengthAsNumber
@end 

然后在需要的代码中实现即可:

NSString* strTest = @"dddsdwesa";
NSLog(@"ccc=%@",[strTest lengthAsNumber]);

局限性

类别虽然好用,但是有两个局限性:
(1)无法向类中添加新的实例变量,类别没有位置容纳实例变量。
(2)名称冲突,即当类别中的方法与原始类方法名称冲突时,类别具有更高的优先级。类别方法将完全取代初始方法从而无法再使用初始方法。

协议

协议有些类似Java的接口,所以作用就不多说了,直接进入正题(我是Java出身,所以Java使用的时间较长,接口的好处数不胜数,尤其是对于程序的设计方面)。

声明

@protocol Personable <NSObject>

-(void)info:(NSString*)name;

@end

实现

@interface Student : Person<Personable>

@end

Student类继承Person类,并实现Personable协议,所以需要在Student.m中实现对应的方法info。

-(void)info:(NSString*)name{
    NSLog(@"info");
}

更多的开发知识,可以关注我的公众号:

《Objective-C类别和协议》

    原文作者:mymdeep
    原文地址: https://www.jianshu.com/p/95fc105214ff
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞