Objective-C What is ISA
[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
(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
유형.앞서 우리가 분석한 바와 같이
Class
는 Class
의 별명이다.struct objc_class
상속자struct objc_class
그 실현을 깊이 이해하려면 먼저 몇 가지를 알아야 한다.struct objc_object
arm64 또는 64비트에서 진짜입니다.자세한 내용은 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); }
```
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 。 。
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.