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

在有些场景中,我们不想创建一个实例对象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
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。