【问题标题】:NSMutableString append does nothingNSMutableString append 什么都不做
【发布时间】:2012-07-04 07:56:23
【问题描述】:

在使用 C++ 之后,我是 Objective-C 的新手。 在 XML 文件解析期间使用 NSMutableString 时遇到问题。 我有这样的 NSMutableString 结构:

struct HotelStruct {
...
NSMutableString *h_name;
...
};

然后,我将 CurrentStruct 声明为 ParserDelegate 的实例变量:

@interface ParserDelegate : NSObject <NSXMLParserDelegate> {
...
struct HotelStruct CurrentStruct;
...
}

最后,我尝试将字符串附加到 CurrentStruct.h_name (m_isName == YES):

-(void)parser:(NSXMLParser*)parser foundCharacters:(NSString *)string {
if (m_isName) {
[CurrentStruct.h_name appendString:string];
}

但是调试器说 CurrentStruct.h_name 在像之前一样执行 AppendString 之后仍然是 0x0,而字符串变量具有所需的值。 我有点困惑,因为看起来 appendString 只是被跳过了。 我会很感激任何帮助。谢谢!

【问题讨论】:

  • 向 nil 发送消息总是会导致 ObjC 中的空操作。如果您知道 CurrentStruct.h_name == 0x0、appendString: 或您发送的任何其他消息,它不会有任何区别。把它想象成乘以 0
  • 哦,这确实解释了一些事情。看起来 CurrentStruct.h_name 在某处变为 nil 。我正在完成另一个人的项目,所以我想他的代码中可能会有答案。非常感谢,非常感谢您的帮助!

标签: objective-c ios


【解决方案1】:

你需要初始化你的字符串对象:

h_name = [[NSString alloc] init];

完成后不要忘记释放它:

[h_name release];

【讨论】:

  • 由于它埋在结构中,你必须做 CurrentStruct.h_name = [[NSMutableString alloc] init];和释放一样
  • 我用 'CurrentStruct.h_name = [[NSMutableString alloc] init];' 来初始化它但这并没有改变任何东西..
  • 所以你能发布你的初始化代码和流程的相关部分吗?
  • -(void)parserDidStartDocument:(NSXMLParser *)parser { ... CurrentStruct.h_name = [[NSMutableString alloc] init]; }
  • 因此,请确保在到达附加代码之前首先初始化的字符串。空指针错误明确指出对象未初始化
【解决方案2】:

是否有理由不使用标准对象而不是结构?这可能是因为NSString 尚未被初始化/分配。

试试这个:

CurrentStruct-> h_name = [[NSString alloc] init];

【讨论】:

  • 可能是因为使用了 C++ :) 我分配了 MutableString 但它没有改变任何东西。
【解决方案3】:

它会正常工作

 -(void)parser:(NSXMLParser*)parser foundCharacters:(NSString *)string {

     if (m_isName) {

         if(!CurrentStruct.h_name)
             CurrentStruct.h_name = [[NSMutableString alloc] init];

           [CurrentStruct.h_name appendString:string];

           NSLog(CurrentStruct.h_name);
           NSLog(m_isName);
       }
    }

注意:请查看控制台日志,使用后不要忘记释放内存

【讨论】:

  • 用户没有提到 ViewControllers,你不应该假设他们正在使用它们。总的来说,您的回答指出了问题并说明了如何解决它,所以我没有投反对票
  • 这将在解析器每次找到新字符时覆盖字符串。我认为这会产生非常意想不到的结果。
猜你喜欢
  • 1970-01-01
  • 2019-03-08
  • 2016-12-24
  • 2017-04-18
  • 2011-08-03
  • 2014-05-11
  • 2014-09-10
  • 1970-01-01
  • 2023-03-29
相关资源
最近更新 更多