Iphone 尝试更改随机抛出的不可变对象
程序的一部分从uitextfield中获取文本,将其复制到可变字符串,然后执行Iphone 尝试更改随机抛出的不可变对象,iphone,objective-c,memory-management,nsmutablestring,Iphone,Objective C,Memory Management,Nsmutablestring,程序的一部分从uitextfield中获取文本,将其复制到可变字符串,然后执行 sharedManager.ce_name=name.text [sharedManager.ce_name replaceOccurrencesOfString:@" " withString:@"%20" options:NSLiteralSearch range:NSMakeRange(0, [sharedManager.ce_name length])]; 在这一点上,它总是
sharedManager.ce_name=name.text
[sharedManager.ce_name replaceOccurrencesOfString:@" " withString:@"%20"
options:NSLiteralSearch range:NSMakeRange(0, [sharedManager.ce_name length])];
在这一点上,它总是给我“尝试变异不可变对象”-它不是随机的
第一次出现这个错误时,我把它改为
sharedManager.ce_name=(NSMutableString *)name.text
NSMutableString *mutable_name = [NSMutableString stringWithString:name.text];
sharedManager.ce_name=mutable_name;
这仍然让我尝试改变不可变对象错误,但它会随机发生-奇怪吧
然后我把它改成了
sharedManager.ce_name=(NSMutableString *)name.text
NSMutableString *mutable_name = [NSMutableString stringWithString:name.text];
sharedManager.ce_name=mutable_name;
我这样做还没有失败,但我确信我还没有找到解决办法
我的问题是:
1) 它在第一次修复后随机执行这一事实是否表明我有一些深层次的内存管理问题
2) 为什么C型演员没把它修好
3) 我当前的修复程序能正常工作吗
谢谢您的时间:)
如果至少看不到所涉及变量的声明,就很难确定,但您的最终解决方案是,创建一个新的可变字符串可能是正确的解决方案。至于你的问题,
这里的问题是你使用铸造的方式。当您强制转换指针时,它只是开始将该位置的内存当作表示该类型的数据块来处理 如果我有一个指向汽车类的指针:Car*mycar;,我把它扔给一个人物体:(Person*)我的车;,程序将尝试访问那里的内存,就像它指向一个人对象一样。然而,汽车不是人,除非是在旧的电视情景喜剧中,所以当它试图访问此功能或呼叫功能的成员时,它将尝试进入一个内存位置,该位置包含它期望的内容以外的内容,并且会发生未定义的事情(通常是撞车)
NSMutableString和NSString在这方面是不兼容的,因此从一个转换到另一个将导致糟糕的时刻。您的修复([NSMutableString stringWithString:])是正确的解决方案。等等,如果sharedManager.ce_名称是一个NSMutable字符串,那么:sharedManager.ce_名称=(NSMutableString*)name.text将不会使sharedManager.ce_名称包含一个不可变的字符串?ce_名称必须是可变的,否则不应该让您编译。名称是UITextField,对吗?那么name.text是一个NSString,而不是可变的,所以通过将其转换为可变字符串,您只是告诉obj-c在所有错误的位置查找方法。我的猜测是,当且仅当文本中确实存在空格时,您才会出现错误,否则它不会试图更改它,因此您不会出现错误。太棒了!谢谢你解决了我的问题。然而,我最欣赏的是你解释了演员的真正作用。我从来没有这样想过:)