Objective-C类别和协议

作者: mymdeep | 来源:发表于2017-01-14 17:04 被阅读73次

    这一章的讲解最好能够对比代码,我将代码放在了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类别和协议

        本文链接:https://www.haomeiwen.com/subject/vubebttx.html