在有些場景中,我們不想創建一個實例對象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