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. set UVA 11136 Hoax or what

    题目传送门 题意:训练指南P245 分析:set维护,查询删除最大最小值 #include <bits/stdc++.h> using namespace std; typedef lon ...

  2. Servlet 获取 ApplicationContext

    一般使用Spring完成了注入,在Service或SpringMVC 中可以通过注解的形式来获取 Spring的已经注入的Spring的bean如下所示: @Resource(name = " ...

  3. Git常用命令举例

    clone一个git project到本地 git clone https://github.com/huahuiyang/network-certification.git 到这个目录下,可以发现有 ...

  4. 关于listView 中的聚焦问题

    我在使用listView+adapter 中,遇到一个问题,就是item项添加了若干个可以被监听的控件后 在listView中的setOnItemClickListener失效了 原因是焦点已经在it ...

  5. BZOJ2149 : 拆迁队

    设$c[i]=g[i]+\frac{i(i+1)}{2}-a[i]\times i-a[i]$,$d[i]=a[i]-i$ $f[i]$表示以$i$为结尾最多保留多少个建筑,则 $f[i]=\max( ...

  6. H5 浏览器开发文档

    http://sja.co.uk/controlling-which-ios-keyboard-is-shown https://developer.apple.com/library/safari/ ...

  7. 20145304 Java第四周学习报告

    20145304<Java程序设计>第四周学习总结 教材学习内容总结 1.继承共同行为: 继承基本上就是避免多个类间重复定义共同行为,关键词为extends. 代码如下: //继承共同行为 ...

  8. [Leetcode] Permutation Sequence

    The set [1,2,3,…,n] contains a total of n! unique permutations. By listing and labeling all of the p ...

  9. Linux之硬件管理(不断更新中)

    1 查看CPU信息 [root@limt01 .ssh]# lscpu Architecture:          x86_64 CPU op-mode(s):        32-bit, 64- ...

  10. 使用jQuery 的.on() 提交表单

    示例: $(function () { $(document).on('submit', '#FormId', function () { var val = $("#Name") ...