Objective-c中category是不能直接创建属性的,这时候我们要用到Objc的runtime来实现

用到的方法有两个

一个是get方法 一个set方法

//get方法
objc_getAssociatedObject(<#id object#>, <#const void *key#>) //set方法
objc_setAssociatedObject(<#id object#>, <#const void *key#>, <#id value#>, <#objc_AssociationPolicy policy#>)

先来解剖一下

1.get 方法

看字面意思,方法中第一个参数为对象,第二个为key

那么就是获取当前对象的某个key的值

2.set 方法

第一个同样为对象,第二个为key,第三个为value,第四个为属性的类型(相当于设置assign,weak,strong,copy等)

既然同样要用到key,那么意思很简单了,key就是对应我们这个属性的,通过key取值,通过key设值

文本使用uiview的categroy作为例子

首先新建一个category的 class

然后就是 创建属性

在.h 中 加入

@property (assign,nonatomic) CGFloat            someHeight;

然后在.m中 实现 set和get方法

这里我用的是CGFloat类型

由于objc给某个key设值的是对象,我们还要用到NSNumber进行一个转换

/** 创建key */
static const char kSomeHeightKey = '\0';
/** set 方法 */
- (void)setSomeHeight:(CGFloat)someHeight{
//存
NSNumber *value = CGFLOAT_IS_DOUBLE?[NSNumber numberWithDouble:someHeight]:[NSNumber numberWithFloat:someHeight];
objc_setAssociatedObject(self, &kSomeHeightKey, value, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
}
/** get 方法 */
- (CGFloat)someHeight{
// 取 由于从key中获取到的是对象(存的也是) 要进行一个对象转换.
// 若类型是对象类型则不需要本转换 直接return objc_getAssociatedObject(object,&key);
NSNumber *value = objc_getAssociatedObject(self, &kSomeHeightKey);
return CGFLOAT_IS_DOUBLE?[value doubleValue]:[value floatValue];
}

运行效果

如有错误请指正:) 欢迎交流

Objective-C 在Categroy中创建属性(Property)的更多相关文章

  1. Labview中创建属性节点和调用节点的用法

    创建属性节点 个人感觉有点像C中的指针 创建调用节点

  2. C#中的属性-Property

    C#的属性一直都有用,但具体了解的不是很深,而且一些注意事项也没有太在意过,糊里糊涂的用着.这两天看了C#的书专门学习了一下属性,这才知道,原来属性也有这么多东西~ ~今天记录一下,算是对学习的一个检 ...

  3. 【整理】Object-C中的属性(Property)的Setter:assign,copy,retain,weak,strong之间的区别和联系

    iOS编程过程中,经常看到一些属性前面有些修饰符,比如copy,retain等. 这些关键字,是Object-C语言中,对于Property的setter. Mac官网: The Objective- ...

  4. Python: 浅淡Python中的属性(property)

    起源:项目过程中需要研究youtube_dl这个开源组件,翻阅其中对类的使用,对比c#及Delphi中实现,感觉Python属性机制挺有意思.区别与高级编程语言之单一入口,在类之属性这一方面,它随意的 ...

  5. WPF样式中TargetType 属性 (Property) 和 x:Key 属性 (Attribute)

    如第一个示例所示,如果将 TargetType 属性设置为 TextBlock 而不为样式分配 x:Key,样式就会应用于所有 TextBlock 元素.这种情况下,x:Key 隐式设置为 {x:Ty ...

  6. Python中的属性管理

    Python管 理属性的方法一般有三种:操作符重载(即,__getattr__.__setattr__.__delattr__和 __getattribute__,有点类似于C++中的重载操作符).p ...

  7. Object的属性property详细解释(自动生成成员变量)

    类Class中的属性property: 在ios第一版中,我们为输出口同时声明了属性和底层实例变量,那时,属性是oc语言的一个新的机制,并且要求你必须声明与之对应的实例变量,例如: @interfac ...

  8. Spring依赖注入的方式、类型、Bean的作用域、自动注入、在Spring配置文件中引入属性文件

    1.Spring依赖注入的方式 通过set方法完成依赖注入 通过构造方法完成依赖注入 2.依赖注入的类型 基本数据类型和字符串 使用value属性 如果是指向另一个对象的引入 使用ref属性 User ...

  9. OC中对于属性的总结(@property)

    在没有属性之前: 对成员变量进行改动都要用到设置器:setter来改动 Person *per =[[Person alloc] init]; 对象通过设置器对成员变量内容进行修该 [per setN ...

随机推荐

  1. C# 词法分析器(一)词法分析介绍 update 2014.1.8

    系列导航 (一)词法分析介绍 (二)输入缓冲和代码定位 (三)正则表达式 (四)构造 NFA (五)转换 DFA (六)构造词法分析器 (七)总结 虽然文章的标题是词法分析,但首先还是要从编译原理说开 ...

  2. 关于ui修改的若干想法

    1.现在发现统一规划好各种xml资源.图片资源还是很重要的. 为什么?因为,很多一些ui设计,比如标题.文字大小.列表的宽高都是统一的, 据我个人理解,一个ui多个部分,如果很多部分都是设计上统一的, ...

  3. WPF 颜色转换

    从字符串到画刷: var converter = new System.Windows.Media.BrushConverter(); var brush = (Brush)converter.Con ...

  4. 【BZOJ1060】[ZJOI2007]时态同步 树形DP

    [BZOJ1060][ZJOI2007]时态同步 Description 小Q在电子工艺实习课上学习焊接电路板.一块电路板由若干个元件组成,我们不妨称之为节点,并将其用数字1,2,3-.进行标号.电路 ...

  5. Java NIO之缓冲区Buffer

    Java NIO的核心部件: Buffer Channel Selector Buffer 是一个数组,但具有内部状态.如下4个索引: capacity:总容量 position:下一个要读取/写入的 ...

  6. oracle中利用trigger,sequence自动生成ID

    http://zhanghong.iteye.com/blog/865937 1. 首先创建数据库表 SQL> create table customer( 2  id number(8) no ...

  7. ubifs总体设计分析

    1.     设计需求 flash设备区别与一般的块设备,有如下特点: 存在坏块 使用寿命较短 存储介质不稳定 读写速度慢 不支持随机访问(nand) 只能通过擦除将0改成1 最小读写单位为page ...

  8. [小工具]ChemistryHelper

    // 此博文为迁移而来,写于2015年3月25日,不代表本人现在的观点与看法.原始地址:http://blog.sina.com.cn/s/blog_6022c4720102vuv7.html 前几天 ...

  9. 使用SQLAlchemy对Firebird数据库进行操作

    来这个公司已经一周了,度过了开始的无聊日子准备正式准备做点东西了,这几天接触了一下文件数据库InterBase,尝试在Ubuntu上连接其开源版本Firebird,因为公司使用的是SQLAlchemy ...

  10. Map 映射

    package lis0924; import java.util.HashMap; import java.util.Iterator; import java.util.Map; import j ...