通过runtime对类别进行属性的扩展

category使用  objc_setAssociatedObject/objc_getAssociatedObject 实现添加属性

属性 其实就是 get/set 方法。

我们可以使用 objc_setAssociatedObject/objc_getAssociatedObject 实现添加属性实现 动态向类中添加 方法

@interfaceNSObject (CategoryWithProperty)

@property (nonatomic, strong) NSObject*property;

@end
@implementationNSObject (CategoryWithProperty)

- (NSObject *)property {

returnobjc_getAssociatedObject(self, @selector(property));

}

- (void)setProperty:(NSObject *)value {

objc_setAssociatedObject(self, @selector(property), value, OBJC_ASSOCIATION_RETAIN_NONATOMIC);

}

@end
时间: 2024-12-15 09:59:07

通过runtime对类别进行属性的扩展的相关文章

runtime在实际开发中的应用-为类别添加属性

利用运行时set和get这两个API,可以让类别添加属性 1.创建一个类别:NSObject+Category 2..h生命get和set方法 @property(nonatomic,copy)NSString *name; 3..m重写set和get方法,内部利用runtime给属性赋值和取值 char nameKey; - (void)setName:(NSString *)name { // 将某个值跟某个对象关联起来,将某个值存储到某个对象中 objc_setAssociatedObje

给类别添加属性(通过@dynamic和objc_setAssociatedObject实现)

通过@dynamic和objc_setAssociatedObject,实现给类别添加属性,前者说明:程序员手动实现setter和getter,后者则是动态给对象添加属性.两个配合使用可以实现给对象添加属性. 下面代码以scrollview为例,给scrollView添加一个refreshView属性,别的地方可以像正常属性一样使用refreshView: [头文件] @interface UIScrollView (Refresh) @property (nonatomic) RefreshV

[读书笔记]C#学习笔记五: C#3.0自动属性,匿名属性及扩展方法

前言 这一章算是看这本书最大的收获了, Lambda表达式让人用着屡试不爽, C#3.0可谓颠覆了我们的代码编写风格. 因为Lambda所需篇幅挺大, 所以先总结C#3.0智能编译器给我们带来的诸多好处, 下一遍会单独介绍Lambda表达式. 这篇主要包括的内容有: 自动属性,隐式类型,对象集合初始化,匿名类型,扩展方法. 下面一起来看下C#3.0 所带来的变化吧. 1,自动实现的属性在C#3.0之前, 定义属性时一般会像下面这样去编写代码: 1 class Person 2 { 3 //定义私

Runtime之成员变量&属性&关联对象

上篇介绍了Runtime类和对象的相关知识点,在4.5和4.6小节,也介绍了成员变量和属性的一些方法应用.本篇将讨论实现细节的相关内容. 在讨论之前,我们先来介绍一个很冷僻但又很有用的一个关键字:@encode 1.类型编码 为了协助运行时系统,编译器用字符串为每个方法的返回值.参数类型和方法选择器编码,使用的编码方案在其他情况下也很有用.在 Objective-C 运行时的消息发送机制中,传递参数时,由于类型信息的缺失,需要类型编码进行辅助以保证类型信息也能够被传递.在实际的应用开发中,使用案

Runtime 实现 动态添加属性

利用动态加载为对象添加一个 block 点击属性; .h 文件 1 #import <UIKit/UIKit.h> 2 3 @interface UIView (Tap) 4 /** 5 * 动态添加手势 6 */ 7 - (void)setTapActionWithBlock:(void (^)(void))block ; 8 @end .m 文件 1 #import "UIView+Tap.h" 2 #import <objc/runtime.h> 3 /*

C#学习笔记四: C#3.0自动属性&amp;匿名属性及扩展方法

前言 这一章算是看这本书最大的收获了, Lambda表达式让人用着屡试不爽, C#3.0可谓颠覆了我们的代码编写风格. 因为Lambda所需篇幅挺大, 所以先总结C#3.0智能编译器给我们带来的诸多好处, 下一遍会单独介绍Lambda表达式. 这篇主要包括的内容有: 自动属性,隐式类型,对象集合初始化,匿名类型,扩展方法. 下面一起来看下C#3.0 所带来的变化吧. 1,自动实现的属性在C#3.0之前, 定义属性时一般会像下面这样去编写代码: 1 class Person 2 { 3 //定义私

利用runtime给分类添加属性

在分类中利用@property添加属性,只能声明实例变量的存取声明,而没有存取方法的实现,可以利用runtime实现. 在头文件中定义属性 @property (nonatomic, copy)NSString *name; 在.m文件中实现存取方法 static char *key = "name"; - (NSString *)name { // 根据关联的key,获取关联的值. return objc_getAssociatedObject(self, key); } - (vo

Runtime 查找 对象的属性

/** 运行时 :runtime 可以访问隐藏的一些属性 */ + (void)initialize { unsigned int count = 0; //拷贝出所有的成员变量列表 这是一个数组 Ivar *ivars = class_copyIvarList(["类名" class], &count); for (int i = 0; i < count; i ++) { // Ivar ivar = *(ivars + i); Ivar ivar = ivars[i

iOS学习之UIView中的clipsTobounds属性及扩展

在一个视图中动态添加一个子视图,并在子视图中添加一个UIButton, 运行后发现虽然在界面上可以看到这个buton,但是点击这个按钮的时候按钮却没响应,纠结了很久也没发现是什么问题,代码如下: UIView *view = [UIView alloc] init]; UIButton *button = [UIButton buttonWithType:UIButtonTypeRoundedRect]; button.frame = CGRectMake(20, 20, 50, 30); [b