iOS:Class类型属性的存储策略

1、前言

有些情况下,我们需要对一个类增加这样一个成员属性,用来保存一个类,类似这样;

#import 

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修饰,在属性指向区域的内存管理上效果都是一样。

你可能感兴趣的:(iOS:Class类型属性的存储策略)