OC Category 使用举例

category中增加一个属性(需要显式生命存取方法,不生成成员变量)

#import <Foundation/Foundation.h>
#import "UTShareContent.h"

@interface UTShareContent (ItemID)

@property (nonatomic, strong)  NSString *itemId;

@end

runtime 保存属性的数据,需要引入<objc/runtime.h>:

使用 objc_setAssociatedObject 和 objc_getAssociatedObject 方法:

/** 
 * Sets an associated value for a given object using a given key and association policy.
 * 
 * @param object The source object for the association.
 * @param key The key for the association.
 * @param value The value to associate with the key key for object. Pass nil to clear an existing association.
 * @param policy The policy for the association. For possible values, see “Associative Object Behaviors.”
 * 
 * @see objc_setAssociatedObject
 * @see objc_removeAssociatedObjects
 */
OBJC_EXPORT void objc_setAssociatedObject(id object, const void *key, id value, objc_AssociationPolicy policy)
    __OSX_AVAILABLE_STARTING(__MAC_10_6, __IPHONE_3_1);

/** 
 * Returns the value associated with a given object for a given key.
 * 
 * @param object The source object for the association.
 * @param key The key for the association.
 * 
 * @return The value associated with the key \e key for \e object.
 * 
 * @see objc_setAssociatedObject
 */
OBJC_EXPORT id objc_getAssociatedObject(id object, const void *key)
    __OSX_AVAILABLE_STARTING(__MAC_10_6, __IPHONE_3_1);

这里使用 @selector(itemId) 只是提供一个const void * 类型的key, 使用其他指针也可以(比如字符串),只要保证在这个类中唯一:

#import "UTShareContent+ItemId.h"
#import <objc/runtime.h>

@implementation UTShareContent(ItemID)

//@dynamic itemId;

-(NSString *)itemId{
    return objc_getAssociatedObject(self, @selector(itemId));
}

-(void)setItemId:(NSString *)itemId{
    objc_setAssociatedObject(self, @selector(itemId), itemId, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
}

@end
时间: 2024-10-31 06:36:07

OC Category 使用举例的相关文章

iOS在Xcode6中怎么创建OC category文件

升级Xcode6之后我们发现,本来创建category文件的选项突然不见了,那在在Xcode6中怎么创建OC category文件,其实它还是在,只是Xcode6把他放在了第二步选择了: 点击下一步,我们就可以选择创建category文件了 然后选择如下:比如:给Person类写一个名字为QYMa的分类 ok!这样分类就建好啦! (我都写完了,为什么不让我发-_-#,200字很重要嘛?解决问题才是关键啊!我不想写废话的!是你逼我的!-_-#.今天外面继续是打雷 闪电大暴雨!忽然想起一篇文章名字叫

OC category (分类,类目),日期类常用用法

学了这么久OC我们都知道OC中的类分为系统类和自定义的类,当我们在使用系统为我们提供的类时有时往往不能满足我们的需要,例如,字符串NSString类提供了比较字符串的方法compare,为数组排序时系统默认的是升序,当需要为数组按降序排序时,一种途径是需要新建一个类写一个降序的方法,而另一个途径就是系统提供的category(分类,类目),分类(类目,category)的目的为了给没有源代码的类添加方法(只能添加方法,不能添加实例变量),是扩充一个类功能的方式之一,为原有类扩充的方法会成为原类的

OC category如何注入新的属性(property)

利用OC Runtime 在.h中 @interface NSObject (LaserUnicorn) @property (nonatomic, strong) LaserUnicorn *laserUnicorn; @end 在.m中 #import <objc/runtime.h> static void * LaserUnicornPropertyKey = &LaserUnicornPropertyKey; @implementation NSObject (LaserUn

iOS xcode6 新建OC Category文件

首先:File -> New File 接下来界面如下,选择Objective-C File,然后Next 在这里选择 Category 即可

OC学习-类的扩展

类目-Category 作用:主要为没有源代码的类添加方法(比如系统的类) 定义Category 新建文件 选择OC Category模板 填写类和分类名 在.h中添加方法声明 在.m中添加方法实现 声明Category NSString+StringMethod.h @interface NSString (StringMethod) - (void)sayHi; @end NSString+StringMethod.m @implementation NSString (StringMeth

黑马程序员---OC基础7【ARC概念】【ARC对象内存管理】【分类Category】

------- iOS培训.Android培训.Java培训.期待与您交流! ---------- [ARC概念]   1.指针的分类 1)强指针,默认的情况下,所有的指针都是强指针,关键字strong: 2)弱指针,_ _weak关键字修饰符的指针 2.ARC概念 自动引用计数 永远不要写retain和release.autorelease三个关键字 编译器会在编译的时候自动插入retain和release.autorelease, 是一个编译器的特性:“垃圾回收”是运行时的特性 3.ARC工

八.OC基础加强--1.autorelease的用法 2.ARC下内存管理 3.分类(category)4.block的学习

1.autorelease的用法   1.自动释放池及autorelease介绍 (1)在iOS程序运行过程中,会创建无数个池子,这些池子都是以栈结构(先进后出)存在的. (2)当一个对象调用autorelease时,会将这个对象放到位于栈顶的释放池中 . 2.为什么会有autorelease? OC的内存管理机制中比较重要的一条规律是:谁申请,谁释放. 但有些情况下,开发者并不能确定某些对象何时释放.这时候就需要自动释放池. 它的好处是: (1)不需要再关心对象释放的时间 : (2)不需要再关

OC中protocol、category和继承的区别

利用继承,多态是一个很好的保持"对扩展开放.对更改封闭"(OCP)的办法,也是最常见的一种方法.Objective C还支持另外两种语法来支持OCP:Protocol和Category.Protocol只能定义一套接口,而不能提供实现,变相的也是一种Abstract class的实现方式(oc 语法上本身不支持抽象基类).Category可以为类提供额外的接口和实现.那么到底三者(继承, Protocol,Category)在使用上到底有什么本质的区别呢?在我看来,protocol的作

OC基础--分类(category) 和 协议(protocol)

OC 中的category分类文件相当于 C#中的部分类:OC 中的protocol协议文件(本质是头文件)相当于 C#中的接口.今天就简单说明一下OC中的这两个文件. 由于视频中的Xcode版本低,导致了分类文件和协议文件没有找到,最后百度得知: 如图:Xcode 7.2版本中的category文件和protocol文件都归类到了Objective-C File 中   一.category文件: 作用:可以扩展自定义类,或者系统类.下面的实例,是扩展了NSString 类,在类中扩展了计算字