【问题标题】:Check for substring of NSString crashing检查 NSString 的子字符串是否崩溃
【发布时间】:2011-09-05 15:27:15
【问题描述】:

我已尝试以两种方式检查 NSString 中是否出现子字符串,但都已崩溃。这是我从 NSManagedObject 的一个属性中获得的 NSString 对象。

  1. 使用 NSRange

    NSString *searchString = @"drive";

    NSRange range = [text rangeOfString:searchString options:(NSCaseInsensitiveSearch)];

    if (range.location != NSNotFound) { NSLog(@"找到"); }

  2. 使用 NSScanner

    NSScanner *scanner = [NSScanner scannerWithString:text];

    NSLog(@"%d",[scanner scanString:searchString intoString:nil]);

这两种方法在 text = @"drive" 时都有效,但在文本为 "i drive" 或 "drive to" 时会导致 EXC_BAD_ACCESS 崩溃。如果文本是“idrive”或“driveto”,则不会发生任何事情。

更奇怪的是,有时示例会抛出 NSInvalidArgumentExceptions,说我试图将 NSCFSet 或 DateComponents 对象传递给 rangeOfString:,但我在我的应用程序中都没有使用它们。

有什么想法吗?

【问题讨论】:

  • 什么是文本?它包含什么?
  • 哪个方法调用会崩溃?文本是如何创建的?我敢打赌,文本已被过度发布且不再有效。
  • @JeremyP 我认为发生的事情是我从我的 NSManagedObject 获取字符串属性,如下所示: text = managedObject.text;然后我正在删除 managedObject。那么我是否正确地说 text 不包含字符串,它包含指向 managedObject.text 的指针,该指针不再存在?

标签: iphone objective-c xcode ios5


【解决方案1】:

如果您有时收到 EXC_BAD_ACCESS 并且有时收到消息“object-of-type-you-weren'texpecting does not respond to method”的机会您是否没有将对象保留足够长的时间,并且在您到达使用它的位置之前它已被释放。

如果你到达那里时内存还没有被重用,那么一切似乎都可以正常工作。如果该空间已被另一个对象重用并完美对齐,即相同的指针,您将得到类似“x 不响应选择器”的信息。如果它以这样的方式被覆盖,指针不指向一个有效的对象,你会得到EXC_BAD_ACCESS

【讨论】:

  • 啊,这很有道理。谢谢!我希望我能给你投票,但我没有名声。
  • @ntesler:谢谢。无论如何,接受的答案值得 15 代表。
【解决方案2】:

以下内容对我来说非常有用,包括空格。

NSString *string = @"hello one two three";
if ([string rangeOfString:@"one two"].location == NSNotFound) {
    NSLog(@"string does not contain substring");
} else {
    NSLog(@"string contains substring!");
}

如果您希望它不区分大小写,只需将字符串和搜索字符串都转换为小写即可。我猜你应该知道该怎么做。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-12-08
    • 2013-12-13
    • 2011-11-09
    • 2013-05-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多