Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >iOS Extension Category Protrol 例子理解

iOS Extension Category Protrol 例子理解

作者头像
星宇大前端
发布于 2019-01-15 07:40:28
发布于 2019-01-15 07:40:28
45900
代码可运行
举报
文章被收录于专栏:大宇笔记大宇笔记
运行总次数:0
代码可运行

直接上代码

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

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

目录:

Person类没有暴漏任何方法:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
//
//  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
代码运行次数:0
运行
AI代码解释
复制
//
//  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
代码运行次数:0
运行
AI代码解释
复制
//
//  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
代码运行次数:0
运行
AI代码解释
复制
//
//  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
代码运行次数:0
运行
AI代码解释
复制
//
//  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
代码运行次数:0
运行
AI代码解释
复制
//
//  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
代码运行次数:0
运行
AI代码解释
复制
//
//  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 删除。

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

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
iOS Runtime应用小例子 不引入类怎么创建这个类的对象和执行类的方法
想必大家都知道Runtime 。到底Runtime是怎么创建的呢,下面是一个小demo。
星宇大前端
2019/01/15
1.1K0
IOS开发系列—Objective-C之Foundation框架
概述 我们前面的章节中就一直新建Cocoa Class,那么Cocoa到底是什么,它和我们前面以及后面要讲的内容到底有什么关系呢?Objective-C开发中经常用到NSObject,那么这个对象到底是谁?它为什么又出现在Objective-C中间呢?今天我们将揭开这层面纱,重点分析在IOS开发中一个重要的框架Foundation,今天的主要内容有: 1. Foundation概述 2. 常用结构体 3. 日期 4. 字符串 5. 数组 6. 字典 7. 装箱和拆箱 8. 反射 9. 拷贝 10. 文件操作
用户1941540
2018/06/20
8270
Runtime 创建动态一个类 添加成员变量 属性
这篇文章主要介绍OC Runtime怎么动态创建类,添加成员变量,添加属性,对象动态绑定keyValue,添加方法。 (主要介绍成员变量和属性) 对于概念还不理解的可以看之前的博客。代码说的再多不如自己写一遍,写过之后肯定有不同的理解。好脑子不如烂笔头,没有什么概念要说的,代码里有注释,下面直接上代码。
星宇大前端
2019/01/15
1.7K0
iOS中的Category
xy_ss
2023/11/22
2330
iOS中的Category
协议与分类--24:分类(Category)
Category也称为分类、类目、类别等,Category可以在不修改原来类的基础上,为这个类补充一些方法
xy_ss
2023/11/22
2550
Core Animation实战四(视觉效果)
我们知道View中封装了一些动画和显示效果那我们为什么还要操作CALayer层面上呢?
星宇大前端
2019/01/15
5860
OC学习7——类别、扩展和协议
1、我么在调用NSLog()方法打印一个对象时,实际上是调用了该对象的description方法,这个description方法就和Java中的toString()方法一样。所以,下面两行代码其实是一样的 NSLog(@"%@", p) ; NSLog(@"%@", [p description]) ; description方法是NSObject类的一个实例方法,所有的OC都是NSObject类的子类,因此,所有的类都有description方法。description方法方法通常用于实现这样的一个功
mukekeheart
2018/02/27
7450
iOS 接入 Strava 分享模块(上篇:FitSDK)
fit 是一种文件协议,体积小巧,多用于可穿戴设备记录、传输运动与健康数据。官方提供了 C、C++、Java 语言的 SDK 和非常详细的使用文档。因此在 iOS 端接入 fit 就需要在 C 或 C++ 的 SDK 基础上进行一点面向对象的封装。
零式的天空
2022/03/25
1K0
AVFoundation框架理论+实战一(文本语音转换)
下面是这本书的扫描版:链接: https://pan.baidu.com/s/1miy0K7A 密码: ateq  (仅供学习使用)
星宇大前端
2019/01/15
1.4K0
【IOS 开发】Objective-C Foundation 框架 -- 字符串 | 日期 | 对象复制 | NSArray | NSSet | NSDictionary | 谓词
-- 创建字符串 : 使用 init 开头的实例方法, 也可以使用 String 开头的方法;
韩曙亮
2023/03/27
1.4K0
OC - Category 和 Extension
从以上可以看到,Category 编译之后的底层结构时struct category_t。 objc4源码链接:https://opensource.apple.com/tarballs/objc4/ 下面我们进入Runtime的最新源代码objc4-756.2进行分析。在源代码中与 Category 相关的代码基本都放在objc-runtime-new.h和objc-runtime-new.mm两个文件中。我们先来看一下 Category 在源代码中的定义struct category_t。
师大小海腾
2020/04/16
1.4K0
iOS开发之浅谈MVVM的架构设计与团队协作
今天写这篇博客是想达到抛砖引玉的作用,想与大家交流一下思想,相互学习,博文中有不足之处还望大家批评指正。本篇博客的内容沿袭以往博客的风格,也是以干货为主。 由于本人项目经验有限,关于架构设计方面的东西理解有限,我个人对MVVM的理解主要是借鉴于之前的用过的MVC的Web框架~在学校的时候用过ThinkPHP框架,和SSH框架,都是MVC的架构模式,今天MVVM与传统的MVC可谓是极为相似,也可以说是兄弟关系,也就是一家人了。 说道架构设计和团队协作,这个对App的开发还是比较重要的。即使作为一个专业的搬砖者
lizelu
2018/01/11
1.3K0
iOS开发之浅谈MVVM的架构设计与团队协作
字符串(NSString)、字典(NSDictionary)、数组(NSArray)的总结
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u010105969/article/details/46853419
用户1451823
2018/09/13
1.2K0
IOS 扫二维码
注意:本篇文章采用了IOS7的新特性来扫二维码,所以系统支持要IOS7以上,如果要兼容IOS7之前的版本,自行找库来支持。
用户7718188
2021/09/22
5060
Core Animation实战三(图层几何学)
了解游戏的人一般都知道锚点,在UIView中我们很少用到。anchorPoint位于图层的中点,所以图层的将会以这个点为中心放置。anchorPoint属性并没有被UIView接口暴露出来,这也是视图的position属性被叫做“center”的原因。但是图层的anchorPoint可以被移动,比如你可以把它置于图层frame的左上角,于是图层的内容将会向右下角的position方向移动(图3.3),而不是居中了。
星宇大前端
2019/01/15
4510
iOS底层原理总结 - 探寻Runtime本质(四)
首先来看一道面试题。 下列代码中Person继承自NSObject,Student继承自Person,写出下列代码输出内容。
xx_Cc
2018/08/02
9530
iOS底层原理总结 - 探寻Runtime本质(四)
iOS 静态类库项目的创建与使用
打开 Xcode , 选择 File -> New -> Workspace , 将 Workspace 命名为 Test.xcworkspace , 并选择合适的目录。
beginor
2020/08/10
8270
iOS 静态类库项目的创建与使用
Core Animation实战五(变换)
/* Translate `t' by `(tx, ty)' and return the result:
星宇大前端
2019/01/15
4670
iOS_11_tableViewCell使用alertView变更数据
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/117667.html原文链接:https://javaforall.cn
全栈程序员站长
2022/07/05
5720
iOS_11_tableViewCell使用alertView变更数据
iOS 程序内存指针和对象的理解
最近对指针和内存有产生了浓厚的兴趣,然后就想研究一下iOS 程序指针内存对象这些东西都是怎么关联在一起的呢,又是怎么工作的呢。
星宇大前端
2019/01/15
9600
相关推荐
iOS Runtime应用小例子 不引入类怎么创建这个类的对象和执行类的方法
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验