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的头文件:

[cpp] view plaincopy
  1. #import <UIKit/UIKit.h>
  2. @interface UIImageView (associate)
  3. @property(nonatomic,strong)NSString* myString;
  4. -(void)Output;
  5. @end

category的实现文件:

[cpp] view plaincopy
  1. #import <objc/runtime.h>
  2. #import "UIImageView+associate.h"
  3. static void * MyKey = (void *)@"MyKey";
  4. @implementation UIImageView (associate)
  5. -(NSString*)myString {
  6. return objc_getAssociatedObject(self, MyKey);
  7. }
  8. -(void)setMyString:(NSString *)string {
  9. objc_setAssociatedObject(self, MyKey, string, OBJC_ASSOCIATION_COPY_NONATOMIC);
  10. }
  11. -(void)Output {
  12. NSLog(@"output mystring:%@",self.myString);
  13. }
  14. @end

说明:头文件中添加了一个属性和一个方法,在实现文件中使用associative特性为属性重写了setter和getter方法,都比较简单。

测试一下:

[cpp] view plaincopy
  1. UIImageView *imageView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"Icon@2x.png"]];
  2. imageView.bounds = CGRectMake(50, 50, 100, 100);
  3. imageView.myString = @"hello world";
  4. [self.view addSubview:imageView];
  5. [imageView Output];

运行后,模拟器上就显示一个图片,终端输出:output mystring:hello world

iOS 扩展机制category与associative相关推荐

  1. iOS学习系列 - 扩展机制category与associative

    iOS学习系列 - 扩展机制category与associative category与associative作为objective-c的扩展机制的两个特性,category即类型,可以通过它来扩展方 ...

  2. IOS中扩展机制Category和associative

    在ios开发中,有时候会遇到以下的问题,需要在一个类中添加自己的一些属性和方法.一般的做法是重写一个类来继承它,但是有时候就只是需要添加一些简单的属性和方法,那么这样做就显得过于麻烦,其实在IOS中还 ...

  3. 【iOS开发】——Category底层原理、Extension、关联对象

    [iOS开发]--Category底层原理.Extension.关联对象 Category是什么?它可以用来干什么? Category特点 Category的实质以及实现过程 Category结构体 ...

  4. Spring 的微内核与FactoryBean扩展机制--转载

    作者:江南白衣 原文地址: http://www.blogjava.net/calvin/archive/2005/08/30/11099.html http://www.blogjava.net/c ...

  5. 聊聊Dubbo - Dubbo可扩展机制源码解析

    2019独角兽企业重金招聘Python工程师标准>>> 摘要: 在Dubbo可扩展机制实战中,我们了解了Dubbo扩展机制的一些概念,初探了Dubbo中LoadBalance的实现, ...

  6. 《软件建模与设计: UML、用例、模式和软件体系结构》一一2.10 UML扩展机制

    本节书摘来自华章计算机<软件建模与设计: UML.用例.模式和软件体系结构>一书中的第2章,第2.10节,作者:(美)Hassan Gomaa,更多章节内容可以访问云栖社区"华章 ...

  7. Dubbo源码分析(三)Dubbo中的SPI和自适应扩展机制

    前言 我们在往期文章中,曾经深入分析过Java的SPI机制,它是一种服务发现机制.具体详见:深入理解JDK的SPI机制 在继续深入Dubbo之前,我们必须先要明白Dubbo中的SPI机制.因为有位大神 ...

  8. SpringBoot解耦的扩展机制 Spring Factories介绍及使用

    一.什么是 SPI机制 Spring Boot中有一种非常解耦的扩展机制:Spring Factories.这种扩展机制实际上是仿照Java中的SPI扩展机制来实现的.SPI的全名为Service P ...

  9. dubbo源码分析系列(1)扩展机制的实现

    1 系列目录 dubbo源码分析系列(1)扩展机制的实现 dubbo源码分析系列(2)服务的发布 dubbo源码分析系列(3)服务的引用 dubbo源码分析系列(4)dubbo通信设计 2 SPI扩展 ...

最新文章

  1. 现在无法开始异步操作。异步操作只能在异步处理程序或模块中开始,或在页生存期中的特定事件过程中开始...
  2. 我去,你写的 switch 语句也太老土了吧
  3. 在64位的环境中使用VS建立Web项目进行Oracle连接需要注意WebDev是32位的
  4. SpringBoot+Mybatis配置Druid多数据源
  5. Xilinx SelectIO 接口
  6. 于计算机交朋友教案,三年级上册信息技术教案-2与计算机交朋友|人教版 (2)
  7. 【数据结构与算法】之深入解析“最好买卖股票的时机含冷冻期”的求解思路与算法示例
  8. linux自定义和使用 shell 环境(一)
  9. android系统开发(六)-HAL层开发基础
  10. 百度编辑器回显js报错Uncaught SyntaxError: Invalid or unexpected token
  11. 如何在Android Studio中获取SHA-1指纹证书以获得调试模式?
  12. Atitit mysql 数据类型 5.7.9 目录 1.1. 数值类型 1 2. 字符串 2 3. 时间日期 2 4. 地理位置 2 5. 几何数据的存储,生成,分析,优化。 空间数据类型(存储)
  13. sql:删除重复数据并且只保留id最小的一条
  14. 双网卡同时上内外网设置教程
  15. x264 2pass编码说明
  16. 举报两年论文终撤稿!123页PDF实名举报985大学导师学术造假后续来了...
  17. Newton牛顿法(一)| 基本思想+迭代公式
  18. Ant批量打包工具的使用
  19. matlab怎么生成三维等值线图,matlab画三维等值线图
  20. 数据库集群技术(转载)

热门文章

  1. java 生产者消费者_基于JAVA的生产者消费者问题
  2. java list 删除元素_Java面试题:List如何一边遍历,一边删除?
  3. java 广义表_java 输入广义表 生成二叉树 | 学步园
  4. 给脚本添加到环境变量_让你的脚本可以在任意地方都可执行的几个方法
  5. windows .bat获取XCOPY返回值
  6. 服务器端Session和客户端Session
  7. tomcat安装与项目部署
  8. atcoder 076
  9. 《Java技术》第九次作业计科1501赵健宇-IO
  10. hdoj - 1258 Sum It Up hdoj - 1016 Prime Ring Problem (简单dfs)