1、前言
有些情况下,我们需要对一个类增加这样一个成员属性,用来保存一个类,类似这样;
#import <Foundation/Foundation.h>
NS_ASSUME_NONNULL_BEGIN
@interface CustomObject : NSObject
/// 保存类
@property (nonatomic, strong) Class classNmae;
@end
NS_ASSUME_NONNULL_END
2、Class属性内存管理策略选用分析
但是我们需要考虑Class成员属性的存储策略strong/assign;
strong:使用strong内存管理策略,内存开辟在堆区,申请和释放由开发者管理,有引用计数的概念;
assign:使用assign内存管理策略,内存开辟在栈区,申请和释放由系统自动管理,引用时引用计数器不会+1;
下边这两种策略在程序上效果一样,都不会报错、警告,运行正常;
@property (nonatomic, strong) Class classNmae;
@property (nonatomic, assign) Class classNmae;
3、Class在OC中定义
Class在OC中定义
typedef struct objc_class *Class;
objc_class 结构体定义:
struct objc_class : objc_object {
...
}
/// Represents an instance of a class.
struct objc_object {
Class _Nonnull isa OBJC_ISA_AVAILABILITY;
};
可以看出类对象同其他类型对象一样,都有isa指针成员。
4、总结
类对象在程序启动时,会自动为我们创建程序定义的每个类的一个类对象。
Class对象在程序中只存在一份,这整个程序运行期间都不会释放,所以我们不用关心类对象引用计数器的变化,对于Class不管使用strong还是assign修饰,在属性指向区域的内存管理上效果都是一样。