Objective-C 「类目、延展、协议」

作者: LuisX | 来源:发表于2016-06-27 15:10 被阅读442次
    Objective-C

    类目(Category)

    (1).为已知的类添加新的方法,无论是否知道类的源代码,这些类包括自己定义的类和系统已有的类。
    (2).将类的实现分散到多个不同的文件中,将多个类目的声明放入同一个.h文件中,将实现放入多个.m方法中。
    (3).使用类目创建对私有方法的前向引用,就是为类创建私有方法。
    (4).向对象添加非正式协议,现在逐渐被正式协议做替代。
    注意:类目里面只能写方法,不能写声明和属性,所以,类目不能作为接口来用

    注意:

    1、类目无法向已有类中添加实例变量。
    2、如果类目中的方法和已有类中的方法名称冲突时,类目中的方法优先级高,如果方法名冲突,已有类中的原始方法便无法使用。
    3、在使用类目的时候,最好是将自己扩展的方法和原始方法区分开来。

    创建Objective-C文件 创建类目文件 生成类目文件

    NSString+LuisX.h文件中

    #import <Foundation/Foundation.h>
    #pragma mark - NSString:分类类型 LuisX:分类名 
    @interface NSString (LuisX) {
      //不能在分类中定义成员
    }   
    
    - (NSInteger)getMyStringLength;         //声明实例方法
    + (NSString *)getHomeDirectory;         //声明类方法
    
    @end
    

    NSString+LuisX.m文件中

    #import "NSString+LuisX.h"
    
    @implementation NSString (LuisX)
    //实现实例方法
    - (NSInteger)getMyStringLength{
        NSInteger stringLength = [self length];
        return stringLength;
    }
    //实现类方法
    + (NSString *)getHomeDirectory{
        return NSHomeDirectory();
    }
    @end
    

    类目演示

        //////////类目演示//////////
    
    #import <Foundation/Foundation.h>
    #import "NSString+LuisX.h"
    
    int main(int argc, const char * argv[]) {
        
        @autoreleasepool {
            
            NSString *str = @"FengXu";
            NSInteger length = [str getMyStringLength];
            NSString *homeDicStr = [NSString getHomeDirectory];
            NSLog(@"实例方法:  %ld", length);
            NSLog(@"类方法: %@", homeDicStr);
            //输出:   实例方法:  6
            //输出:   类方法: /Users/apple
            
        }
      
        return 0;
    }
    

    延展(Extension)

    (1).延展的作用就是定义自己的私有方法。
    (2).在自己类的实现文件中添加类目(匿名类目)来声明私有方法。(只有本类的.m文件中才能使用)。
    (3).形式和类目相同,不用新创建文件,只是把类目的interface地方的文件放在了你需要扩展的类的.m文件里边。

    Father.h文件中

    #import <Foundation/Foundation.h>
    
    @interface Father : NSObject
    
    - (void)work;
    
    @end
    

    Father.m文件中

    #import "Father.h"
    //╭--------------------延展(管理私有)--------------------╮
    //@interface...@end可省略,但不建议。(方便看出哪些是私有的方法)
    //声明私有,()中省略了private
    @interface Father ()
    @property (nonatomic, copy) NSString *company;
    - (void)showMyInfo;
    @end
    //╰--------------------延展(管理私有)--------------------╯
    
    @implementation Father{
        //此处用来定义属性(私有属性)
        NSString *_name;
    }
    
    - (void)work{
        NSLog(@"公有方法");
        [self showMyInfo];
    }
    
    - (void)showMyInfo{
        NSLog(@"私有方法");
    }
    
    @end
    

    延展演示

        //////////延展演示//////////
    
    #import <Foundation/Foundation.h>
    #import "Father.h"
    
    int main(int argc, const char * argv[]) {
        
        @autoreleasepool {
            
            Father *father = [[Father alloc] init];
            [father work];
            //输出:   公有方法
            //输出:   私有方法
            
        }
    
        return 0;
    }
    

    协议(Protocol)

    (1).协议声明了可以被其他的类实现方法。协议本身并不会去实现。
    (2).协议不是类,只是一个其他对象可以实现的接口。
    (3).一个类可以通过协议,用来遵循多个类中的方法,这样可以做到多继承的效果

    注意:

    @required 必须方法 (默认)
    @optional 可选方法

    Girl.h文件中

    #import <Foundation/Foundation.h>
    
    #warning ▧▧▧▧▧▧▧▧▧▧ 1.声明协议 ▧▧▧▧▧▧▧▧▧▧
    @protocol MarriageDelegate <NSObject>
    
    @required       //必须方法(默认)
    - (void)makeMoney;
    - (void)satisfyHer;
    @optional       //可选方法
    - (void)cooking;
    
    @end
    
    
     
    @interface Girl : NSObject
    
    #warning ▧▧▧▧▧▧▧▧▧▧ 2.设置代理人属性 ▧▧▧▧▧▧▧▧▧▧
    @property (nonatomic, assign) id<Marriage> delegate;
    - (void)buybuybuy;
    
    @end
    

    Girl.m文件中

    #import "Girl.h"
    
    @implementation Girl
      
    - (void)buybuybuy{
    #warning ▧▧▧▧▧▧▧▧▧▧ 3.代理人执行方法 ▧▧▧▧▧▧▧▧▧▧
        [self.delegate makeMoney];
    }
    
    @end
    

    Boy.h文件中

    #import <Foundation/Foundation.h>
    #import "Girl.h"
    
    #warning ▧▧▧▧▧▧▧▧▧▧ 4.签订协议 (当前类中要实现必须方法) ▧▧▧▧▧▧▧▧▧▧
    @interface Boy : NSObject <MarriageDelegate>
    
    @end
    

    Boy.m文件中

    #import "Boy.h"
    
    @implementation Boy
      
    #warning ▧▧▧▧▧▧▧▧▧▧ 6.实现协议中声明的必须方法 ▧▧▧▧▧▧▧▧▧▧
    - (void)makeMoney{
        NSLog(@"赚钱");
    }
    
    - (void)satisfyHer{
        NSLog(@"亲吻");
    }
    
    @end
    

    协议演示

        //////////协议演示//////////
     
    #import <Foundation/Foundation.h>
    #import "Girl.h"
    #import "Boy.h"
    
    int main(int argc, const char * argv[]) {
        
        //////////使用代理//////////
        Girl *girl = [[Girl alloc] init];
        Boy *boy = [[Boy alloc] init];
    #warning ▧▧▧▧▧▧▧▧▧▧ 5.指定代理人 ▧▧▧▧▧▧▧▧▧▧
        girl.delegate = boy;
        [girl buybuybuy];
        //输出: 赚钱
      
        //判断是否对象是否遵循某些协议
        BOOL result = [girl conformsToProtocol:@protocol(Marriage)];
        if (result) {
            NSLog(@"遵循Marriage协议");
        }else{
            NSLog(@"不遵循Marriage协议");
        }
        //输出: 不遵循Marriage协议
    
        return 0;
    }
    

    相关文章

      网友评论

      本文标题:Objective-C 「类目、延展、协议」

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