objective c - Error al usar "setValue: forKey:" en el puntero isa de NSString y luego se llama a
objective-c objective-c-runtime (1)
Solo usa NSMutableString
; La mutabilidad es la razón por la que existe. ;)
NSString
es constante. No solo "se ajusta a una const char *
", sino que "no, realmente, esto es inmutable y los detalles de almacenamiento son totalmente opacos para usted".
De hecho, una __NSCFConstantString
ni siquiera está almacenada en el montón; No habrá ningún pedazo de memoria de Malloc con el que pueda muck. Dichas cadenas son generadas por el compilador y el vinculador las coloca en un trozo de memoria que se leerá en tiempo de ejecución y se almacenará en páginas de memoria de solo lectura.
Pero ni siquiera los resultados de [NSString stringWithFormat:@"%d World", 42]
se almacenarán en una porción de memoria malloc()
d asignada de forma exclusiva solo para el buffer de cadena. Lo más probable (pero quizás no, es un detalle de implementación opaco), el mecanismo para construir la cadena con formato producirá un objeto cuyo tamaño será el tamaño de instancia mínimo para cualquier subclase privada de NSString
(ver grupos de clases) es el más apropiado + sin embargo, se necesitan muchos bytes para almacenar los datos de la cadena en sí.
Si bien podrías encontrar los bytes reales en la memoria y mezclarlos directamente, eso sería una grave violación de la encapsulación y sería absolutamente inútil en un programa real.
Tenga en cuenta que el isa
que se está NSObject
es una variable de instancia de NSObject
. Es un puntero al objeto Clase de la instancia. No es necesariamente constante, pero tampoco deberías estar de acuerdo.
Para obtener más información sobre la isa
y por qué está viendo ese bloqueo en particular cuando pegó una instancia de NSString
en la ranura isa
, mi respuesta a esta pregunta puede ser útil (tal vez):
objc_msgSend () tabla de despacho
BTW: Me encanta la pregunta: mientras recorres un camino que está totalmente en desacuerdo con la programación de OO y la Fundación, andar con las entrañas y romper cosas es una forma fantástica de aprender. No dejes que los electores caídos te atrapen ... bueno ... caen, si aparecen.
Heres es lo que tengo en cuanto a error.
libobjc.A.dylib`_objc_trap():
0x14c13f4: pushl %ebp
0x14c13f5: movl %esp, %ebp
0x14c13f7: ud2
Básicamente, estoy tratando de entender cómo funciona NSString
y tratar de encontrar una manera de cambiar el puntero que apunta a la "cadena real (char *)", que se dice que es una constante.
Entonces, encontré que hay un puntero llamado isa que apunta a ( __NSCFConstantString *
). Me llevó a pensar que si cambio ese puntero podría cambiar la cadena.
El código que probé fue este:
NSString *st3 = [[NSString alloc] initWithString:@"hihi"];
[st3 setValue:@"change" forKey:@"isa"];
Y, el resultado que muestra que
Antes de:
Después:
Parece que cambió, pero cambió cada objeto NSString
que tiene la cadena @ "hihi".
Y luego, lo que hice fue [clase st3] con la esperanza de que diera el puntero a isa
y obtuve ese mensaje de error en la parte superior.
¿Podría alguien explicar qué está pasando y por qué se comporta así? Y, ¿hay alguna forma de internar (no estoy seguro del término) como en Java?
Por favor, evite decir simplemente usar "NSMutableString". Solo estoy tratando de averiguarlo ya que podría haber alguna manera de hacerlo.