2011-09-05 1 views
5

Tôi đã thử kiểm tra sự xuất hiện của chuỗi con trong một NSString theo hai cách, cả hai đều bị lỗi. Đây là một đối tượng NSString mà tôi nhận được từ một thuộc tính của NSManagedObject.Kiểm tra chuỗi con của lỗi NSString

  1. Sử dụng NSRange

    NSString *searchString = @"drive";

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

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

  2. Sử dụng NSScanner

    NSScanner *scanner = [NSScanner scannerWithString:text];

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

Cả hai công việc này khi văn bản = @ "drive" nhưng gây ra EXC_BAD_ACCESS tai nạn khi văn bản là "i drive", hoặc "drive to". Không có gì xảy ra nếu văn bản là "idrive" hoặc "driveto".

Ngay cả người lạ, đôi khi các ví dụ ném NSInvalidArgumentExceptions, nói rằng tôi đã cố gắng để vượt qua một đối tượng NSCFSet hoặc DateComponents để rangeOfString :, không phải trong số đó tôi sử dụng trong ứng dụng của tôi.

Bất kỳ ý tưởng nào?

+0

Văn bản là gì? Nó chứa gì? –

+0

Cuộc gọi phương thức nào gặp sự cố? Văn bản được tạo như thế nào? Đặt cược của tôi là văn bản đã hết hạn và không còn hợp lệ nữa. – zaph

+0

@ JeremyP Tôi nghĩ rằng những gì đang xảy ra là tôi nhận được thuộc tính chuỗi từ NSManagedObject của tôi, như vậy: text = managedObject.text; sau đó tôi xóa managedObject. Vì vậy, tôi phải nói rằng văn bản không chứa một chuỗi, nó có chứa một con trỏ đến managedObject.text, mà không còn tồn tại? – ntesler

Trả lời

5

Nếu bạn thỉnh thoảng có được EXC_BAD_ACCESS và đôi khi nhận được thông báo "đối tượng-of-type-bạn-weren't mong không đáp ứng với phương pháp" cơ hội được bạn không duy trì đối tượng trong thời gian dài đủ và nó đang được deallocated trước khi bạn nhận được đến nơi bạn sử dụng nó.

Nếu bộ nhớ không được sử dụng lại khi bạn đến đó, mọi thứ sẽ có vẻ hoạt động. Nếu không gian đã được tái sử dụng cho một đối tượng khác và căn chỉnh hoàn hảo tức là con trỏ giống nhau, bạn sẽ nhận được một cái gì đó như "x không trả lời cho bộ chọn". Nếu nó được ghi đè theo cách mà con trỏ không trỏ đến một đối tượng hợp lệ, bạn sẽ nhận được EXC_BAD_ACCESS

+0

Ah có ý nghĩa hoàn hảo. Cảm ơn bạn! Tôi ước tôi có thể bỏ phiếu cho bạn nhưng tôi không có danh tiếng. – ntesler

+0

@ntesler: Cảm ơn. Câu trả lời được chấp nhận có giá trị 15 đại diện. – JeremyP

5

Sau đây đã làm việc hoàn hảo cho tôi bao gồm cả không gian.

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

Và nếu bạn muốn phân biệt chữ hoa chữ thường, chỉ cần chuyển đổi cả chuỗi và chuỗi tìm kiếm thành chữ thường. Bạn nên biết làm thế nào để làm điều đó tôi đoán.

+1

Mã đó không hoạt động tương tự. – zaph