iOS Runtime应用实例(一)类别添加属性
来源:互联网 发布:做淘宝客服有前景吗 编辑:程序博客网 时间:2024/04/30 23:59
版权声明:本文为博主原创文章,如需转载请注明出处
目录(?)[+]
原创Blog,转载请注明出处
http://blog.csdn.net/hello_hwc?viewmode=list
我的stackoverflow
前言:类别添加属性是Runtime最常见的一个应用。也是个人用的比较多的,前段时间有个需求是要求统计App中的每个控件被点击的次数,虽然友盟能做,不过我们希望统计更加详细,这样就要自己开发一个统计分析的SDK了。每个控件要打一个标签,这时候类别添加属性的作用就体现出来了。
如果为类别添加属性?
使用Runtime.h中的两个方法
这两个方法是为一个对象设置关联对象,等价于添加一个属性
<code class="hljs bash has-numbering">objc_<span class="hljs-keyword">set</span>AssociatedObjectobjc_getAssociatedObject</code><ul style="" class="pre-numbering"><li>1</li><li>2</li></ul><ul style="" class="pre-numbering"><li>1</li><li>2</li></ul>
举个例子,和上文我说的统计分析SDK需要为控件添加一个属性
UIView+LeoExtension.h
<code class="hljs objectivec has-numbering"><span class="hljs-preprocessor">#import <span class="hljs-title"><Foundation/Foundation.h></span></span><span class="hljs-preprocessor">#import <span class="hljs-title"><UIKit/UIKit.h></span></span><span class="hljs-class"><span class="hljs-keyword">@interface</span> <span class="hljs-title">UIView</span> (<span class="hljs-title">LeoExtension</span>)</span><span class="hljs-keyword">@property</span> (copy,<span class="hljs-keyword">nonatomic</span>)<span class="hljs-built_in">NSString</span> * leo_anaylizeTitle;<span class="hljs-keyword">@end</span></code><ul style="" class="pre-numbering"><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li><li>6</li></ul><ul style="" class="pre-numbering"><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li><li>6</li></ul>
UIView+LeoExtension.m
<code class="hljs objectivec has-numbering"><span class="hljs-preprocessor">#import <span class="hljs-title">"UIView+LeoExtension.h"</span></span><span class="hljs-preprocessor">#import <span class="hljs-title"><objc/runtime.h></span></span><span class="hljs-keyword">static</span> <span class="hljs-keyword">const</span> <span class="hljs-keyword">char</span> kAnaylizeTitle;<span class="hljs-class"><span class="hljs-keyword">@implementation</span> <span class="hljs-title">UIView</span> (<span class="hljs-title">LeoExtension</span>)</span>-(<span class="hljs-built_in">NSString</span> *)leo_anaylizeTitle{ <span class="hljs-keyword">return</span> objc_getAssociatedObject(<span class="hljs-keyword">self</span>, &kAnaylizeTitle);}-(<span class="hljs-keyword">void</span>)setLeo_anaylizeTitle:(<span class="hljs-built_in">NSString</span> *)leo_anaylizeTitle{ objc_setAssociatedObject(<span class="hljs-keyword">self</span>, &kAnaylizeTitle,leo_anaylizeTitle, OBJC_ASSOCIATION_COPY_NONATOMIC);}<span class="hljs-keyword">@end</span></code><ul style="" class="pre-numbering"><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li><li>6</li><li>7</li><li>8</li><li>9</li><li>10</li><li>11</li><li>12</li><li>13</li><li>14</li></ul><ul style="" class="pre-numbering"><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li><li>6</li><li>7</li><li>8</li><li>9</li><li>10</li><li>11</li><li>12</li><li>13</li><li>14</li></ul>
注意事项
- 添加的属性要增加前缀,例如我上文添加的使用了Leo前缀,原因很简单,开发中难免要用到第三方库,不要和第三方库混淆。同时,iOS SDK会更新,也要确保不要和apple以后的属性名字冲突。
- 添加的属性可以是IBInspectable,IBOutlet等。例如,把上文中的改成IBInspectable,
<code class="hljs objectivec has-numbering"><span class="hljs-keyword">@property</span> (copy,<span class="hljs-keyword">nonatomic</span>) IBInspectable <span class="hljs-built_in">NSString</span> * leo_anaylizeTitle;</code><ul style="" class="pre-numbering"><li>1</li></ul><ul style="" class="pre-numbering"><li>1</li></ul>
那么,在storyboard上再拖拽出一个View的时候,会发现多了一个自定义的属性
应用场景
想添加属性,但是又不想继承的场景。大部分是为了扩展iOS SDK中的类,比如UIView,UIViewController。
举个例子,
现在很多navigationBar都会自动的改变透明度,现在我想写个SDK,用户可以动态的设置navigationBar背景的透明度。
可以的两种实现方式
- 继承,定义一个NavigationBar的子类,用户每次使用我这个子类
- 类别,添加一个自定义的alpha属性
继承的缺点很明显,加入一个用户已经写好了一堆代码,那么每次使用子类导致了他的修改很多。而实用类别,对原有代码几乎没有影响。
0 0
- iOS Runtime应用实例(一)类别添加属性
- iOS Runtime应用实例(一)类别添加属性
- iOS为类别添加属性的方法(RunTime)
- 利用runtime给类别添加属性
- 类别添加属性,即runtime运行时添加属性(动态属性)
- iOS 类别 ---不能添加属性
- iOS 给类别添加属性
- iOS (Category)runtime动态添加属性
- Runtime(三)利用运行时来为类别添加属性
- IOS在类别中添加属性
- iOS 给类别里面添加属性
- IOS类别通过关联对象添加属性
- iOS 如何给类别添加属性
- iOS runtime的应用实例
- iOS runtime的应用实例
- iOS runtime的应用实例
- iOS runtime的应用实例
- RunTime应用--动态给分类添加属性
- Software Architecture Patterns
- 220. Contains Duplicate III
- 不想浪费时间写重复代码(二)
- 访问Google只需一步,超级简单
- windows程序设计笔记
- iOS Runtime应用实例(一)类别添加属性
- SSM项目之---淘淘商城(第一天)
- 十个值得一试的开源深度学习框架
- javascript时间戳和日期字符串相互转换
- java 实现生成文件 然后把文件放到共享文件夹下面 smb
- 安卓如何隐藏APP图标探讨
- 小波变换完美通俗讲解系列之 (一)
- android学习总结(16.09.08)AlertDialog的简单用法
- Android 动态加载布局文件