【发布时间】:2014-06-22 10:03:51
【问题描述】:
这就是我对错误的看法。
libobjc.A.dylib`_objc_trap():
0x14c13f4: pushl %ebp
0x14c13f5: movl %esp, %ebp
0x14c13f7: ud2
所以基本上我试图了解NSString 的工作原理,并试图找到一种方法来更改指向“真实(char *)字符串”的指针,该指针据说是一个常量。
所以,我发现有一个名为 isa 的指针指向 (__NSCFConstantString *)。
这让我想到,如果我改变那个指针,那么我就可以改变字符串。
我试过的代码是这样的:
NSString *st3 = [[NSString alloc] initWithString:@"hihi"];
[st3 setValue:@"change" forKey:@"isa"];
而且,结果显示
之前:
之后:
它似乎改变了,但它改变了每个具有 @"hihi" 字符串的 NSString 对象。
然后我所做的是[st3 class]希望它会给isa指针,然后我在顶部发布了错误消息。
您能解释一下发生了什么以及为什么会这样吗? 而且,有什么办法可以像在 Java 中那样实习(我不太确定这个术语)吗?
请避免说只使用“NSMutableString”我只是想弄清楚可能有一些方法可以做到这一点。
【问题讨论】:
-
哦不,请不要在不知道你在做什么的情况下玩
isa。如果您想了解如何更改对象类别,请使用object_setClass -
即使你改变了类,对象的内部布局也不会匹配新类所期望的。因此,您很可能只会导致崩溃。即使您认为它们应该是独立的副本,也可以共享不可变字符串。因此,您将无法可靠地将更改限制为单个实例。最后,您更改了一个对象的类,但不是将其更改为不同的类,而是将其更改为字符串?!?
@"changed"不是一个类,所以它不适合isa指针(即使修改它是明智的)。 -
cStringUsingEncoding:实际上可能会给你一个指向 NSString 中的 const char* 缓冲区的指针,但没有理由这样做。如果确实如此,并且您更改了该内存位置的数据,则编译器没有理由必须在您期望的代码中使用该数据。
标签: objective-c nsstring objective-c-runtime