Xcode - 连接大字符串时的EXEC_BAD_ACCESS

Fra*_*984 3 xcode objective-c nsstring nsmutablestring

在连接一个大字符串时,我得到一个EXEC_BAD_ACCESS.

我从一个feed读取并创建我的webview我建立了我的字符串,如:

NSString *pageData = @"<h1>header</h1>";

pageData = [pageData stringByAppendingFormat@"<p>"];
pageData = [pageData stringByAppendingFormat@"self.bodyText"];
pageData = [pageData stringByAppendingFormat@"</p>"];
etc
Run Code Online (Sandbox Code Playgroud)

我得到的问题是self.bodytext是21,089个字符,当我对字进行计数时有空格.这样做有更好的方法吗?

谢谢

e.J*_*mes 6

您肯定希望使用NSMutableString这样的事情:

NSMutableString * pageData = [NSMutableString stringWithCapacity:0];

[pageData appendFormat:@"<h1>header</h1>"];
[pageData appendFormat:@"<p>"];
...
Run Code Online (Sandbox Code Playgroud)

NSMutableString是为这种顺序连接而设计的,其中基本的NSString类实际上并不意味着以这种方式使用.每次调用时stringByAppendFormat:,您的原始代码实际上会分配一个新的NSString ,然后继续将已经附加的所有数千个字符复制到其中.这可能很容易导致内存不足错误,因为随着您添加越来越多的调用,临时字符串的大小将呈指数级增长.

使用的NSMutableString当你调用不会重新复制所有的字符串数据appendFormat:,因为可变的字符串维护一个内部缓冲区,只是到它的结束大头针新的字符串.根据字符串的大小,您可能希望提前保留大量内存(为...WithCapacity:参数使用有意义的数字).但除非你遇到性能问题,否则没有必要走这条路.

  • 如果self.bodyText恰好包含一个看起来像格式规范的子字符串(例如'%@'),该怎么办?在运行时,没有给出参数,是否会导致提问者进入EXEC_BAD_ACCESS? (3认同)
  • 由于问题中的示例和答案中的示例代码都没有实际使用格式,因此您应该使用appendString:for NSMutableString(请参阅http://developer.apple.com/mac/library/documentation/cocoa/reference/ Foundation/Classes/NSMutableString_Class/Reference/Reference.html#// apple_ref/doc/uid/20000156-appendString_)或stringByAppendingString:用于NSString实例(请参阅http://developer.apple.com/mac/library/DOCUMENTATION/Cocoa/参考/基金/班/ NSString_Class /参考/ NSString.html#// apple_ref/OCC/instm /的NSString/stringByAppendingString :) (2认同)