美文网首页
Swift与OC内存管理方式比较

Swift与OC内存管理方式比较

作者: 不拘小节123456 | 来源:发表于2021-09-29 13:32 被阅读0次

从内存管理方面:主要比较对于强引用和弱引用的实现逻辑进行比较
1,从引用计数讨论:oc的相对复杂,但是swift的管理性能更加优越.典型的用空间换时间.
oc为isa指针引用计数管理,和SidetablesMap对象全局管理引用计数.在少于19位时采用isa指针存储,过高时采用Sidetable存储

#   define ISA_BITFIELD                                                      \
      uintptr_t nonpointer        : 1;                                       \
      uintptr_t has_assoc         : 1;                                       \
      uintptr_t has_cxx_dtor      : 1;                                       \
      uintptr_t shiftcls          : 33; /*MACH_VM_MAX_ADDRESS 0x1000000000*/ \
      uintptr_t magic             : 6;                                       \
      uintptr_t weakly_referenced : 1;                                       \
      uintptr_t deallocating      : 1;                                       \
      uintptr_t has_sidetable_rc  : 1;                                       \
      uintptr_t extra_rc          : 19

struct SideTable {
    spinlock_t slock;
    RefcountMap refcnts;
    weak_table_t weak_table;
}

对于swift呢?,在每个对象都有一个refCounts的引用计数,由于单独给引用计数分配了一个成员变量,它的存储空间远大于isa指针存储,这个时候就不需要要sidetable这个全局map,避免了查看和多线程读写的加锁等待

struct HeapObject {
  /// This is always a valid pointer to a metadata object.
  HeapMetadata const *metadata;

  // Initialize a HeapObject header as appropriate for a newly-allocated object.
  constexpr HeapObject(HeapMetadata const *newMetadata) 
    : metadata(newMetadata)
    , refCounts(InlineRefCounts::Initialized)
  { }
  
};

2,从弱引用对象讨论:oc采用Sidetable存储弱引用的指针,在dealloc的时候进行设置为nil的操作,从外层api来看,swift在对象deinit的时候读取的引用指针也是nil,但是实现逻辑完全不同,他引入了弱引用对象的概念,把对象分为deinit和dealloc两个生命周期,在对象引用计数为0的时候,如果弱引用计数不为0,改内存不会释放,当外接有访问改弱引用对象是会把改值设为nil,并把弱引用计数减一,当弱引用计数也为0时改内存才会释放.从设计方式看也是用空间来换取时间的思路,避免了oc的map查找,所以从这也可以看出对于现在手机电脑内存没有那么紧张的今天,通过空间来换取时间的方案是非常不错的想法.

struct SideTable {
    spinlock_t slock;
    RefcountMap refcnts;
    weak_table_t weak_table;
}

class HeapObjectSideTableEntry {
  // FIXME: does object need to be atomic?
  std::atomic<HeapObject*> object;
  SideTableRefCounts refCounts;

  public:
  HeapObjectSideTableEntry(HeapObject *newObject)
    : object(newObject), refCounts()
  { }
};

class SideTableRefCountBits : public RefCountBitsT<RefCountNotInline>
{
  uint32_t weakBits;

  // ...

};
截屏2021-10-01 上午9.51.06.png

参考:
https://zhuanlan.zhihu.com/p/58179258

相关文章

  • Swift与OC内存管理方式比较

    从内存管理方面:主要比较对于强引用和弱引用的实现逻辑进行比较1,从引用计数讨论:oc的相对复杂,但是swift的管...

  • iOS面试题(一)

    1、#import和#include的区别,@class代表什么? 2、OC的内存管理方式以及过程。 3、OC中有...

  • 内部管理初步,协议概述

    内存管理方式概述: OC2.0提供两种内存管理方式:垃圾回收机制(gc)和引用计数;gc用于mac系统开发,iOS...

  • swift基础小结1

    swift基础小结 for 循环OC与Swift对比 While循环与downhill循环 OC与swift使用的...

  • iOS 引用计数

    引用计数是一个简单而有效的管理对象生命周期的方式。不管是OC还是Swift语言,其内存管理方式都是基于引用计数的。...

  • 内存管理--iOS

    引用计数是一个简单而有效的管理对象生命周期的方式。不管是oc还是swift,其内存管理方式都是基于引用计数的。当我...

  • 20200428整理

    比较 OC 与 Swift 简略Swift 容易阅读,语法和文件结构简易化Swift 更加安全,它是类型安全的语言...

  • OC与swift的区别

    OC与Swift的区别一(文件结构) OC与Swift的区别一(常量、变量、运算符) OC与Swift的区别三(条...

  • iOS内存泄漏的场景和检测

    内存泄漏的相关定义OC当中内存管理方式:ARC/MRCARC:自动引用计数(系统自动管理内存),由开发人员开辟内存...

  • Objective-C的内存管理-引用计数

    OC的内存管理方式 垃圾回收(Garbage Collection) 手动引用计数管理(Manual Refere...

网友评论

      本文标题:Swift与OC内存管理方式比较

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