通过运行时动态给分类添加属性

#import <UIKit/UIKit.h>

/**
 iOS 开发中,分类默认不允许保存属性

 如果在分类中,定义一个属性,需要自己实现 getter & setter 方法,而且没有 _成员变量

 如果在自己开发的框架中,希望在分类中动态添加属性,可以通过 OC 运行时的关联对象的功能!

 运行时非常重要的一个应用:给分类动态添加属性,结果能够让框架包装的更好,让使用者做出最小的修改!
 */
@interface UIImageView (WebImage)

@property (nonatomic, copy) NSString *urlString;

@end
#import <objc/runtime.h>

@implementation UIImageView (WebImage)

const void *URLStringKey = "URLStringKey";

- (void)setUrlString:(NSString *)urlString {

    /**
     参数:
     1. 属性的持有者
     2. 属性的键值
     3. 属性的数值
     4. 属性的引用类型
     */
    objc_setAssociatedObject(self, URLStringKey, urlString, OBJC_ASSOCIATION_COPY_NONATOMIC);
}

- (NSString *)urlString {
    return objc_getAssociatedObject(self, URLStringKey);
}

@end
时间: 2024-12-31 18:54:44

通过运行时动态给分类添加属性的相关文章

SpringBoot运行时动态添加数据源

此方案适用于解决springboot项目运行时动态添加数据源,非静态切换多数据源!!! 一.多数据源应用场景: 1.配置文件配置多数据源,如默认数据源:master,数据源1:salve1...,运行时动态切换已配置的数据源(master.salve1互相切换),无法在运行时动态添加配置文件中未配置的数据源. 2.配置一个默认数据源,运行时动态添加新数据源使用(本博客适用于此场景) 二.解决方案: Spring提供了AbstractRoutingDataSource用于动态路由数据源,第一种场景

OC对象给分类添加属性

OC对象中不能给分类添加属性,但是在实际开发中,经常为了更好的性能需要给分类添加属性,那么 添加的属性不能有默认的成员变量,需要我们自己实现set和get方法,要用到运行时 如下: #import <objc/runtime.h> //运行时的关联对象,动态添加属性 const void *URLStringKey = "URLStringKey"; //set方法 - (void)setUrlStr:(NSString *)urlStr { objc_setAssocia

分类添加属性之关联引用

分类是不能合成属性的,因为合成属性会生成对应的实例变量,而分类是不允许添加实例变量的(实例变量所在内存区域已初始化为不可更改,无法在动态运行时修改之). 虽然不能增加实例变量,但是添加属性还是可以的,只不过需要自己在分类中实现get和set方法,同时标记属性为动态获取. 其中一种方法叫做关联引用,实现了用存取器来访问属性,当然实际上并没有实例变量,所以本质上只不过是增加了两个方法而已. 首先在.h中声明属性: #import <UIKit/UIKit.h> @interface UIViewC

Objective-C 给分类添加“属性”——关联对象

给分类添加"属性" 咱们知道,分类中可以添加方法,却无法添加属性.那咱们有其他的方法来实现吗? 先来看看下面这段代码: @interface UIView (nl_Frame) @property (nonatomic, assign) CGFloat nl_width; @end @implementation UIView (nl_Frame) - (void)setNl_width:(CGFloat)nl_width { CGRect frame = self.frame; fr

C#在运行时动态创建类型的实现方法

本文实例讲述了C#在运行时动态创建类型的实现方法.是C#项目开发中很实用的技巧.分享给大家供大家参考.具体分析如下: 具体来说, C# 在运行时动态的创建类型是通过动态生成C#源代码,然后通过编译器编译成程序集的方式实现动态创建类型的 . 主要功能代码如下: public static Assembly NewAssembly() { //创建编译器实例. provider = new CSharpCodeProvider(); //设置编译参数. cp = new CompilerParame

LINQ to SQL 运行时动态构建查询条件

在进行数据查询时,经常碰到需要动态构建查询条件.使用LINQ实现这个需求可能会比以前拼接SQL语句更麻烦一些.本文介绍了3种运行时动态构建查询条件的方法. 本文中的例子最终实现的都是同一个功能,从Northwind数据库Customers表中搜索出CompanyName列带有keywords中任意元素的项.keywords是个字符串数组,该数组长度在编译时是不确定的.思路及方法说明写在代码注释中. 1.表达式树 1   public static IEnumerable<Customers> 

C# 在运行时动态创建类型

C# 在运行时动态的创建类型,这里是通过动态生成C#源代码,然后通过编译器编译成程序集的方式实现动态创建类型 public static Assembly NewAssembly() { //创建编译器实例. provider = new CSharpCodeProvider(); //设置编译参数. cp = new CompilerParameters(); cp.GenerateExecutable = false; cp.GenerateInMemory = true; // Gener

浏览器客户端智能自动化:如何取得页面中JavaScript运行时动态生成的URL?

浏览器客户端智能自动化:如何取得页面中JavaScript运行时动态生成的URL? 需求 "页面智能拼接"指的是通过启发式查询DOM树,判断出"下一页"链接,取出其href属性.Chromium的官方插件DOM Distiller完成类似的工作,主要目的就是为了将多页点击流程变成单页的Ajax连续阅读体验. 问题是,现在有些网站为了阻止浏览器客户端这么做,将href属性设置为"#"(或javascript:void()),然后在其onclick事

快速上手Runtime(二)之给分类添加属性

我们都知道,分类是不能直接添加属性的,那么我们有时候又需要实现这个功能,那么我们应该怎么办才能为分类添加上属性呢. Runtime给分类添加属性原理 给一个类声明属性,其实本质就是给这个类添加关联,并不是直接把这个值的内存空间添加到类存空间. Runtime给分类添加属性步骤 1.在分类的.h文件中声明想要定义的属性 2.在分类的.m文件中实现getter和setter方法 3.引入runtime头文件,然后在setter方法中用objc_setAssociatedObject关联对象 比如给N