美文网首页iOS 进阶
iOS 给一个类添加类属性(非分类添加属性)

iOS 给一个类添加类属性(非分类添加属性)

作者: CoderGuogt | 来源:发表于2018-09-29 23:08 被阅读21次

在有些场景中,我们不想创建一个实例对象instance来暂时保存一些值,于是想能够在一个类中有个属性能暂时保存我想要的一些值就好了,接下来就教大家如何给一个类对象Class添加属性。
总体来说这个跟类别添加属性很相似,只不过类别添加属性是添加到实例对象instance中,我们这里是添加到类对象Class中。

  • 新建一个Person
    .h 文件中,创建一个age属性,通常我们创建的样式为
@property (nonatomic, assign) int age; /**< 年龄 */

这样创建的属性,是一个实例对象instance属性,而我们需要创建一个类对象属性Class,这时候我们创建对象需要改成这个样式

@property (nonatomic, assign, class) int age; /**< 年龄 */

然后在 .m中实现age属性的setter方法和getter方法,在这里我使用两种方式去实现 agesetter方法和getter方法

第一种方法,利用变量的方式
  • 先声明一个变量 _age
static int _age = 0;
  • 实现 agesetter方法
+ (void)setAge:(int)age {
    
    if (age != _age) {
        _age = age;
    }
}
  • 接着实现 agegetter方法
+ (int)age {
    
    return _age;
}
第二种方法,利用 runtime方式,通过给类关联一个属性,这个方法类似于给分类添加一个属性,因为objc_getAssociatedObject是关联一个对象的,所以这方式只能创建一个对象属性
  • .h中添加一个字符串name属性
@property (nonatomic, copy, class) NSString *name; /**< 姓名 */
  • 然后在.m中实现setter方法和getter方法
    首先给name属性创建一个key,赋值数据时,通过这个key去进行赋值和获取值
static char *_nameKey = "name";
/**
 name setter 方法
 */
+ (void)setName:(NSString *)name {
    
    objc_setAssociatedObject(self, _nameKey, name, OBJC_ASSOCIATION_COPY);
}

/**
 name getter 方法
 */
+ (NSString *)name {
    
    return objc_getAssociatedObject(self, _nameKey);
}
  • 接下来,对创建的Person对象进行赋值和取值操作
  Person.age = 30;
  Person.name = @"Tom";
        
  NSLog(@"age = %d, name = %@", Person.age, Person.name);

输出结果为:

2018-09-29 22:56:36.318443+0800 ClassProperty[4272:97975] age = 30, name = Tom

这样就为一个类,创建了agename两个属性,就不需要再创建一个实例对象instance去进行暂时的赋值和获取值操作,因为这里类对象只有一份资源,所以这两个属性在工程中也就只有一份存储空间,再进行赋值操作会直接覆盖上次的值
例如:

  Person.age = 30;
  Person.name = @"Tom";
        
  Person.age = 20;
  Person.name = @"Jack";

此时的输出结果为:

2018-09-29 23:07:25.396182+0800 ClassProperty[4305:101954] age = 20, name = Jack

相关文章

  • 在iOS中分类和类中添加属性和方法的区别

    分类和类都可以添加方法和属性 属性分类通过runtime添加属性类直接添加 方法添加方式一样 生成 类中生成的有:...

  • Add CGFloat property to Category

    给扩展类添加CGFloat类型的属性 IOS中可以使用运行时动态给类添加属性,对象类型的属性添加方法大家都知道 但...

  • OC中分类的实现原理

    OC中为类添加一个分类(Category)可以实现为类添加对象方法、类方法、添加属性(添加的属性不生成成员变量)、...

  • runtime -- 动态添加属性

    给分类添加属性 原理:给一个类声明属性,本质就是给这个类添加关系,并不是直接把这个值得内存空间添加到类的内存空间。...

  • runtime相关

    修改系统方法 动态添加方法 动态给系统类添加属性(给分类添加属性) runtime+kvc 转换模型

  • iOS底层学习:类的扩展和关联对象

    类的扩展和分类 category:分类、类别 给类增加方法 不能添加成员变量 可以使用runtime给分类添加属性...

  • 定义BookClass

    //定义图书属性类BookClass 属性类中添加:Bookcls(分类)、BookName(书名)、Price...

  • 知识点33:运行时之动态添加属性(分类中添加)

    2.动态添加属性 1.原理:给一个类声明属性,其实本质就是给这个类添加关联(即将值的地址关联给类的属性,不是在类中...

  • 04 runtime用法之动态添加属性和字典转模型

    1 动态添加属性 若想给系统的类添加属性,可以采用Runtime的方法,比如:给系统的NSObject类添加一个n...

  • iOS分类Category相关知识

    分类能干什么 · 为现有类添加实例方法· 为现有类添加类方法(静态方法)· 为现有类添加属性· 为现有类添加协议·...

网友评论

    本文标题:iOS 给一个类添加类属性(非分类添加属性)

    本文链接:https://www.haomeiwen.com/subject/csqioftx.html