在有些场景中,我们不想创建一个实例对象instance
来暂时保存一些值,于是想能够在一个类中有个属性能暂时保存我想要的一些值就好了,接下来就教大家如何给一个类对象Class
添加属性。
总体来说这个跟类别添加属性很相似,只不过类别添加属性是添加到实例对象instance
中,我们这里是添加到类对象Class
中。
- 新建一个
Person
类
在.h
文件中,创建一个age
属性,通常我们创建的样式为
@property (nonatomic, assign) int age; /**< 年龄 */
这样创建的属性,是一个实例对象instance
属性,而我们需要创建一个类对象属性Class
,这时候我们创建对象需要改成这个样式
@property (nonatomic, assign, class) int age; /**< 年龄 */
然后在 .m
中实现age
属性的setter
方法和getter
方法,在这里我使用两种方式去实现 age
的setter
方法和getter
方法
第一种方法,利用变量的方式
- 先声明一个变量
_age
static int _age = 0;
- 实现
age
的setter
方法
+ (void)setAge:(int)age {
if (age != _age) {
_age = age;
}
}
- 接着实现
age
的getter
方法
+ (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
这样就为一个类,创建了age
和name
两个属性,就不需要再创建一个实例对象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