美文网首页
iOS:Class类型属性的存储策略

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

作者: 丶墨墨丶 | 来源:发表于2021-08-22 02:19 被阅读0次

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

    相关文章

      网友评论

          本文标题:iOS:Class类型属性的存储策略

          本文链接:https://www.haomeiwen.com/subject/nycciltx.html