iOS 扩展机制category与associative
category和associative作为objective-c 扩展机制的两个特性,category可以通过它来扩展方法;associative可以通过它来扩展属性。
在iOS开发过程中,前者category比较常见,也比较简单,这里就不说了,这里主要说一下associative;
后者associative相对用的就比较少,要用associative就必须使用#import<objc/runtime.h>,然后调用objc_setAssociatedObject 和 objc_getAssociatedObject 方法分别为属性添加setter 和 getter方法,就可以实现属性扩展了。
下面介绍一下这两个方法:
①:void objc_setAssociatedObject(id object, void *key, id value, objc_AssociationPolicy policy)
其中的参数分别是:
Parameters
object: The source object for the association.
key: The key for the association.
value: The value to associate with the key key for object. Pass nil to clear an existing association.
policy: The policy for the association
其中的policy有
enum {
OBJC_ASSOCIATION_ASSIGN = 0,
OBJC_ASSOCIATION_RETAIN_NONATOMIC = 1,
OBJC_ASSOCIATION_COPY_NONATOMIC = 3,
OBJC_ASSOCIATION_RETAIN = 01401,
OBJC_ASSOCIATION_COPY = 01403
};
②:id objc_getAssociatedObject(id object, void *key)
Parameters
object: The source object for the association.
key: The key for the association.
Return Value
The value associated with the key key for object.
都比较简单,下面就通过一个demo来说明吧!
我这里是扩展UIImageview为其添加一个方法和一个属性。
category的头文件:
- #import <UIKit/UIKit.h>
- @interface UIImageView (associate)
- @property(nonatomic,strong)NSString* myString;
- -(void)Output;
- @end
category的实现文件:
- #import <objc/runtime.h>
- #import "UIImageView+associate.h"
- static void * MyKey = (void *)@"MyKey";
- @implementation UIImageView (associate)
- -(NSString*)myString {
- return objc_getAssociatedObject(self, MyKey);
- }
- -(void)setMyString:(NSString *)string {
- objc_setAssociatedObject(self, MyKey, string, OBJC_ASSOCIATION_COPY_NONATOMIC);
- }
- -(void)Output {
- NSLog(@"output mystring:%@",self.myString);
- }
- @end
说明:头文件中添加了一个属性和一个方法,在实现文件中使用associative特性为属性重写了setter和getter方法,都比较简单。
测试一下:
- UIImageView *imageView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"Icon@2x.png"]];
- imageView.bounds = CGRectMake(50, 50, 100, 100);
- imageView.myString = @"hello world";
- [self.view addSubview:imageView];
- [imageView Output];
运行后,模拟器上就显示一个图片,终端输出:output mystring:hello world
iOS 扩展机制category与associative相关推荐
- iOS学习系列 - 扩展机制category与associative
iOS学习系列 - 扩展机制category与associative category与associative作为objective-c的扩展机制的两个特性,category即类型,可以通过它来扩展方 ...
- IOS中扩展机制Category和associative
在ios开发中,有时候会遇到以下的问题,需要在一个类中添加自己的一些属性和方法.一般的做法是重写一个类来继承它,但是有时候就只是需要添加一些简单的属性和方法,那么这样做就显得过于麻烦,其实在IOS中还 ...
- 【iOS开发】——Category底层原理、Extension、关联对象
[iOS开发]--Category底层原理.Extension.关联对象 Category是什么?它可以用来干什么? Category特点 Category的实质以及实现过程 Category结构体 ...
- Spring 的微内核与FactoryBean扩展机制--转载
作者:江南白衣 原文地址: http://www.blogjava.net/calvin/archive/2005/08/30/11099.html http://www.blogjava.net/c ...
- 聊聊Dubbo - Dubbo可扩展机制源码解析
2019独角兽企业重金招聘Python工程师标准>>> 摘要: 在Dubbo可扩展机制实战中,我们了解了Dubbo扩展机制的一些概念,初探了Dubbo中LoadBalance的实现, ...
- 《软件建模与设计: UML、用例、模式和软件体系结构》一一2.10 UML扩展机制
本节书摘来自华章计算机<软件建模与设计: UML.用例.模式和软件体系结构>一书中的第2章,第2.10节,作者:(美)Hassan Gomaa,更多章节内容可以访问云栖社区"华章 ...
- Dubbo源码分析(三)Dubbo中的SPI和自适应扩展机制
前言 我们在往期文章中,曾经深入分析过Java的SPI机制,它是一种服务发现机制.具体详见:深入理解JDK的SPI机制 在继续深入Dubbo之前,我们必须先要明白Dubbo中的SPI机制.因为有位大神 ...
- SpringBoot解耦的扩展机制 Spring Factories介绍及使用
一.什么是 SPI机制 Spring Boot中有一种非常解耦的扩展机制:Spring Factories.这种扩展机制实际上是仿照Java中的SPI扩展机制来实现的.SPI的全名为Service P ...
- dubbo源码分析系列(1)扩展机制的实现
1 系列目录 dubbo源码分析系列(1)扩展机制的实现 dubbo源码分析系列(2)服务的发布 dubbo源码分析系列(3)服务的引用 dubbo源码分析系列(4)dubbo通信设计 2 SPI扩展 ...
最新文章
- 现在无法开始异步操作。异步操作只能在异步处理程序或模块中开始,或在页生存期中的特定事件过程中开始...
- 我去,你写的 switch 语句也太老土了吧
- 在64位的环境中使用VS建立Web项目进行Oracle连接需要注意WebDev是32位的
- SpringBoot+Mybatis配置Druid多数据源
- Xilinx SelectIO 接口
- 于计算机交朋友教案,三年级上册信息技术教案-2与计算机交朋友|人教版 (2)
- 【数据结构与算法】之深入解析“最好买卖股票的时机含冷冻期”的求解思路与算法示例
- linux自定义和使用 shell 环境(一)
- android系统开发(六)-HAL层开发基础
- 百度编辑器回显js报错Uncaught SyntaxError: Invalid or unexpected token
- 如何在Android Studio中获取SHA-1指纹证书以获得调试模式?
- Atitit mysql 数据类型 5.7.9 目录 1.1. 数值类型	1 2. 字符串	2 3. 时间日期	2 4. 地理位置	2 5. 几何数据的存储,生成,分析,优化。 空间数据类型(存储)
- sql:删除重复数据并且只保留id最小的一条
- 双网卡同时上内外网设置教程
- x264 2pass编码说明
- 举报两年论文终撤稿!123页PDF实名举报985大学导师学术造假后续来了...
- Newton牛顿法(一)| 基本思想+迭代公式
- Ant批量打包工具的使用
- matlab怎么生成三维等值线图,matlab画三维等值线图
- 数据库集群技术(转载)
热门文章
- java 生产者消费者_基于JAVA的生产者消费者问题
- java list 删除元素_Java面试题:List如何一边遍历,一边删除?
- java 广义表_java 输入广义表 生成二叉树 | 学步园
- 给脚本添加到环境变量_让你的脚本可以在任意地方都可执行的几个方法
- windows .bat获取XCOPY返回值
- 服务器端Session和客户端Session
- tomcat安装与项目部署
- atcoder 076
- 《Java技术》第九次作业计科1501赵健宇-IO
- hdoj - 1258 Sum It Up hdoj - 1016 Prime Ring Problem (简单dfs)