前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >iOS Extension Category Protrol 例子理解

iOS Extension Category Protrol 例子理解

作者头像
星宇大前端
发布2019-01-15 15:40:28
4180
发布2019-01-15 15:40:28
举报
文章被收录于专栏:大宇笔记大宇笔记

直接上代码

先读懂代码才能更好的理解含义。

Demo地址:https://github.com/RainManGO/ExtensionCateGoryProtrolDemo

目录:

Person类没有暴漏任何方法:

代码语言:javascript
复制
//
//  Person.h
//  ExtensionCateGoryProtrolDemo
//
//  Created by apple on 2017/12/14.
//  Copyright © 2017年 ZY. All rights reserved.
//

#import <Foundation/Foundation.h>
#import "Study.h"

@interface Person : NSObject<Study>

@end
代码语言:javascript
复制
//
//  Person.m
//  ExtensionCateGoryProtrolDemo
//
//  Created by apple on 2017/12/14.
//  Copyright © 2017年 ZY. All rights reserved.
//

#import "Person.h"
#import <objc/runtime.h>

//这也是类扩展
@interface Person ()

@property(nonatomic,assign) int age;

@end

@implementation Person

-(void)logAge{
    self.age = 18;
    NSLog(@"%d",self.age);
}

-(void)Eat{
    NSLog(@"Eat");
}

-(void)Study{
    NSLog(@"Study");
}

-(void)setFriendName:(NSString *)name{
    objc_setAssociatedObject(self, @"friendName", name,OBJC_ASSOCIATION_COPY_NONATOMIC);
}

-(NSString *)friendName{
    return objc_getAssociatedObject(self, @"friendName");
}

@end

Category用runtime方法实现了可以设置属性:

代码语言:javascript
复制
//
//  Person+Run.h
//  ExtensionCateGoryProtrolDemo
//
//  Created by apple on 2017/12/14.
//  Copyright © 2017年 ZY. All rights reserved.
//

#import "Person.h"

@interface Person (Run)

@property(nonatomic,strong)NSString * name;

-(void)Run;

@end
代码语言:javascript
复制
//
//  Person+Run.m
//  ExtensionCateGoryProtrolDemo
//
//  Created by apple on 2017/12/14.
//  Copyright © 2017年 ZY. All rights reserved.
//

#import "Person+Run.h"
#import <objc/runtime.h>

@implementation Person (Run)

-(void)Run{
    NSLog(@"Run");
}

-(void)setName:(NSString *)name{
    objc_setAssociatedObject(self, @"name", name,OBJC_ASSOCIATION_COPY_NONATOMIC);
}

-(NSString *)name{
    return objc_getAssociatedObject(self, @"name");
}

@end

单独的Extension文件相当于一个需要自己实现的Category(本例子已经在Person类实现):

代码语言:javascript
复制
//
//  Person+Eat.h
//  ExtensionCateGoryProtrolDemo
//
//  Created by apple on 2017/12/14.
//  Copyright © 2017年 ZY. All rights reserved.
//

#import "Person.h"

@interface Person ()

@property(nonatomic,copy)NSString * friendName;

-(void)logAge;

-(void)Eat;

@end

Protocol和Extension一样需要别人实现,我理解的区别是Extension必须要你扩展的类实现,而protocol谁遵守协议谁实现:

代码语言:javascript
复制
//
//  Study.h
//  ExtensionCateGoryProtrolDemo
//
//  Created by apple on 2017/12/14.
//  Copyright © 2017年 ZY. All rights reserved.
//

#import <Foundation/Foundation.h>

@protocol Study <NSObject>

-(void)Study;

@end

调用类:

代码语言:javascript
复制
//
//  ViewController.m
//  ExtensionCateGoryProtrolDemo
//
//  Created by apple on 2017/12/14.
//  Copyright © 2017年 ZY. All rights reserved.
//

#import "ViewController.h"
#import "Person+Run.h"
#import "Extension/Person+Eat.h"
@interface ViewController ()

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    
    Person  *  Mryang  = [Person new];
    Mryang.name =  @"Mryang";
    Mryang.friendName =@"MrsLu";
    NSLog(@"%@",Mryang.name);
    NSLog(@"%@",Mryang.friendName);
    
    [Mryang logAge];
    [Mryang Run];
    [Mryang Eat];
    [Mryang Study];
}



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


@end

打印结果可想而知。见demo

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2017年12月15日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 直接上代码
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档