La magia es (no, en realidad, así lo llama CLANG) es una optimización más formalmente conocida como puntero etiquetado. Debido a todo el espacio extra que ofrece un puntero en un espacio de direcciones de 64 bits (que de todos modos ni siquiera utiliza los 64 bits completos), los bits superiores se pueden reservar para contener datos arbitrarios. Apple ha aprovechado esta oportunidad, combinada con las actualizaciones recientes del tiempo de ejecución, para implementar NSNumber y Collection Literals comunes como punteros etiquetados. El tiempo de ejecución ahora tiene una serie de rutas rápidas configuradas para enmascarar el isa bit mágico (en este momento, el LSB) y leer los mensajes a estos objetos a pesar de que los punteros etiquetados técnicamente no son objetos. Si desea ver esto en acción, inicie LLDB e intente po (id)
. Dados los números correctos, obtendrá un puntero etiquetado para un literal entero o dos.
La magia isa hace más que solo contar cuentas de referencia. Los bits superiores también almacenan indicadores de si un objeto tiene objetos asociados adjuntos, un destructor C ++ (si no, el tiempo de ejecución lo lee a través de otra ruta rápida durante la desasignación), bits para el depurador para distinguir objetos reales de basura no inicializada, si el objeto se desasigna, y si el objeto es lo suficientemente grande como para necesitar un suplemento de recuento de referencia lateral.
Por otro lado, si desea, hay dos formas válidas y una forma hack de deshabilitar punteros etiquetados. La primera es una variable de entorno, OBJC_DISABLE_NONPOINTER_ISA
. El segundo es anular +allocWithZone:
y configurar el puntero isa usted mismo. (Tenga en cuenta que invocar object_setClass()
en este método mantiene la optimización habilitada). La última forma terrible es tomar un puntero etiquetado y establecer el LSB en cero, lo que hará que el tiempo de ejecución lo lea como un puntero normal y probablemente se bloquee y se queme.
- ¿Qué interfaz móvil tiene una UX mejor / más intuitiva: Tinder (deslizar hacia la izquierda / derecha), o Hot or Not (botones de toque)?
- Cómo encontrar los mejores desarrolladores de iOS en Washington, DC
- Cómo contratar una empresa de desarrollo de aplicaciones iOS para aplicaciones empresariales
- ¿Cómo es que muchas aplicaciones de gestión de tareas personales y GTD tienen casi las mismas características y todas tienen éxito?
- ¿Prefieres Ruby on Rails o PHP para el backend de tu aplicación iOS y por qué?