2

我有一个很大的 NSMutableString(可能有数百兆字节),需要对其执行大量 rangeOfCharacterFromSet: 操作。

为了提高性能,我想让一个 NSOperationQueue 将字符串拆分为约 100kb 的块并异步处理每个块。

但是因为字符串太大,为每个线程制作不可变的副本是不可行的。

假设我不允许修改字符串(我打算阻塞主线程直到操作队列完成),这样安全吗?

Apple 将 NSString 记录为线程安全的,所有不可变对象“通常”不是线程安全的,但大概只适用于某些方法?rangeOfCharacterFromSet 是我唯一使用的。

此代码将在 OS X 和 iOS 上运行(通常在 iOS 上使用较小的字符串)

4

1 回答 1

3

虽然我怀疑 NSMutableString (或至少其常见实现)对此是安全的,但最安全的答案可能是创建一个不可变副本,然后针对它执行所有操作。

我的谨慎是因为非常大的 NSMutableStrings 可能在内部实现为树,如果该树在读取时进行延迟重新平衡,则可能存在线程安全问题。

于 2013-05-04T00:38:17.360 回答