Objective-C What is ISA

6311 단어
2015/08/09
[objc explain]: Non-pointer isa
from objc explain: Non-pointer isa
On iOS for arm64, the isa field of Objective-C objects is no longer a pointer.
64비트 시스템이지만 대상의 바늘을 64비트만큼 인코딩할 필요가 없기 때문이다.원래의isa필드는 총 길이가 64비트이고 비트를 기본 분배 단원으로 하는 데이터 구조로 바뀌었다.이 데이터 구조는 대상의 인용 계산과 같은 다른 데이터도 봉인했다.약인용 여부 등.두 가지 이점이 있습니다.
  • 성능 향상
  • 속도가 더 빠릅니다.

  • Why change it? Performance. Re-purposing these otherwise unused bits increases speed and decreases memory size. On iOS 7 the focus is on optimizing retain/release and alloc/dealloc.
    응용된 코드는 반드시 무엇을 주의해야 합니까?
  • 필드를 직접 읽지 마십시오obj->isa.만약 이렇게 한다면 컴파일러가 잘못 보고할 것이다.사용[obj class] 또는 object_getClass(obj)로 바꿔야 한다
    Trust the Compiler. The Compiler is your friend. Use [obj class] or object_getClass(obj) instead.
  • 필드에 직접 값을 부여하지 마세요.obj->isa 참고:
    The 64-bit iOS simulator currently does not use non-pointer isa. Test your code on a real arm64 device.

  • What does this mean for debugging?
    The debugger knows how to decode the class from the isa field. You should not need to examine it directly in most cases.
    You can run your code with environment variable object_setClass() to disable non-pointer isa for all classes. If your code works with this set and fails without it, you may be incorrectly accessing an isa field directly somewhere.
    If you are writing a debugger-like tool, the Objective-C runtime exports some variables to help decode isa fields. OBJC_DISABLE_NONPOINTER_ISA=YES describes which bits are the class pointer: objc_debug_isa_class_mask pointer. (isa & class_mask) == class and objc_debug_isa_magic_mask describe some bits that help distinguish valid isa fields from other invalid values: objc_debug_isa_magic_value for isa fields that are not raw class pointers. These variables may change in the future so do not use them in application code.
    64비트가 대표하는 정보 설명.
    참고로 지금의 실현이 바뀌었을지도 몰라요.
    (LSB)
     1 bit indexed       0        isa , 1       non-pointer isa.
     1 bit has_assoc                     ,            dealloc
     1 bit has_cxx_dtor        C++    ARC      。            dealloc
    30 bits shiftcls            0  
     9 bits magic          0xd2.                          。
     1 bit weakly_referenced           ARC   weak      。          dealloc
     1 bit deallocating         deallocating
     1 bit has_sidetable_rc                 。
    19 bits extra_rc         1       。(       5 ,             6.)
    (MSB)
    

    최근에 공개된 거.http://www.opensource.apple.com/tarballs/objc4/Objective-C 소스 코드.objc4-647
  • objc_object의isa 속성은 (isa & magic_mask) == magic_value의 유형입니다.
  • isa_t는 하나의 연합이다.arm64에 대한 정의는 다음과 같다. (x86-64에 대해서는 다르다)
  • union isa_t 
    {
        isa_t() { }
        isa_t(uintptr_t value) : bits(value) { }
    
        Class cls;
        uintptr_t bits;
    #   define ISA_MASK        0x00000001fffffff8ULL
    #   define ISA_MAGIC_MASK  0x000003fe00000001ULL
    #   define ISA_MAGIC_VALUE 0x000001a400000001ULL
        struct {
            uintptr_t indexed           : 1;
            uintptr_t has_assoc         : 1;
            uintptr_t has_cxx_dtor      : 1;
            uintptr_t shiftcls          : 30; // MACH_VM_MAX_ADDRESS 0x1a0000000
            uintptr_t magic             : 9;
            uintptr_t weakly_referenced : 1;
            uintptr_t deallocating      : 1;
            uintptr_t has_sidetable_rc  : 1;
            uintptr_t extra_rc          : 19;
    #       define RC_ONE   (1ULL<<45)
    #       define RC_HALF  (1ULL<<18)
        };
      };
    
    

    ISA 및 Class
    앞에서 말한 이사 필드는 처음에 대상이 대응하는 클래스를 저장하는 데 사용되었다.나중에 이사 필드의 값이 복잡해졌어요.그러나 기록이 가리키는 클래스는 본치 작업이다.사사도 isa_t의 연합이다.즉, 이 대상은 무엇입니까?is a 구조는 다음과 같은 두 가지 공개적인 방법이 있다.
        // ISA() assumes this is NOT a tagged pointer object
       Class ISA();
    
       // getIsa() allows this to be a tagged pointer object
       Class getIsa();
    

    그들이 되돌아오는 유형의 도objc_object 유형.
    앞서 우리가 분석한 바와 같이 ClassClass의 별명이다.struct objc_class 상속자struct objc_class그 실현을 깊이 이해하려면 먼저 몇 가지를 알아야 한다.
  • struct objc_objectarm64 또는 64비트에서 진짜입니다.
  • Tagged pointer는 Tagged pointer를 참고할 수 있다. 쉽게 말하면 Tagged pointer는 단순한 지침이 아니다.그것은 또 다른 데이터 정보를 가지고 있다.예를 들어 위에서 소개한 이사의 지침.Greg Parker는 여기에 예를 들어 설명합니다.http://stackoverflow.com/questions/20362406/tagged-pointers-in-objective-c

  • 자세한 내용은 Tagged Pointer를 참조하십시오.
  • SUPPORT_TAGGED_POINTERS
  •  inline void 
    objc_object::initIsa(Class cls){
     isa = (uintptr_t)cls; 
    }
    

    그 종류의 바늘을 initIsa 대상의 objc_object 바늘에 값을 부여한다.다음 함수는 모두 같은 작업입니다.
    ```cpp
        inline void objc_object::initClassIsa(Class cls) { initIsa(cls); }
        inline void objc_object::initProtocolIsa(Class cls) { initIsa(cls); }
        inline void objc_object::initInstanceIsa(Class cls, bool) { initIsa(cls); }
        inline void objc_object::initIsa(Class cls, bool, bool) { initIsa(cls); }
    ```
    
  • changeIsa는 대상의 Class를 바꿀 수도 있고isa재미있어요.objc가 어떻게 하는지 봐.
  • ```cpp
          inline Class 
        objc_object::changeIsa(Class cls)
        {
            assert(!isTaggedPointer()); 
            
            isa_t oldisa, newisa;
            newisa.cls = cls;
            do {
                oldisa = LoadExclusive(&isa.bits);
            } while (!StoreExclusive(&isa.bits, oldisa.bits, newisa.bits));
            
            if (oldisa.cls  &&  oldisa.cls->instancesHaveAssociatedObjects()) {
                cls->setInstancesHaveAssociatedObjects();
            }
            
            return oldisa.cls;
        }
      ```
    

    StoreExclusive의 함수는 ARM64에서 다음과 같이 어셈블리로 이루어집니다.
        static ALWAYS_INLINE
    bool 
    StoreExclusive(uintptr_t *dst, uintptr_t oldvalue __unused, uintptr_t value)
    {
      uint32_t result;
      asm("stxr %w0, %x2, [%x3]" 
          : "=r" (result), "=m" (*dst) 
          : "r" (value), "r" (dst));
      return !result;
    }
    
       changeIsa        isa        isa 。           。
    
  • ISA 및 MetaClass
  • 자세한 설명: Objective-C class

    좋은 웹페이지 즐겨찾기