Это должно помочь вам:
NSString *fileContents = [NSString stringWithContentsOfFile:file encoding:encoding error:&error];
NSUInteger newlineCount = [fileContents numberOfOccurrencesOfString:@"\n"];
@interface NSString ()
- (NSUInteger)numberOfOccurrencesOfString:(NSString *)aString;
- (NSUInteger)numberOfOccurrencesOfChar:(char)aChar;
@end
@implementation NSString ()
- (NSUInteger)numberOfOccurrencesOfString:(NSString *)aString {
NSRange range = [self rangeOfString:aString];
NSUInteger length = [self length];
NSUInteger count = 0;
while (range.location != NSNotFound) {
range = [self rangeOfString:aString options:0 range:NSMakeRange(range.location + range.length, length - range.location - range.length)];
count++;
}
return count;
}
- (NSUInteger)numberOfOccurrencesOfChar:(char)aChar {
const char *cString = [self cStringUsingEncoding:NSUTF8StringEncoding];
NSUInteger stringLength = strlen(cString);
NSUInteger count = 0;
for (int i = 0; i < stringLength; i++) {
if (cString[i] == aChar) {
count++;
}
}
return count;
}
@end
Пока «numberOfOccurferencesOfString:» не выделяет дополнительную память и поддерживает строковые иглы,
«numberOfOccurferencesOfChar:» выделяет автоматически выпущенную копию строки NSString и выполняет поиск одного символа. ""
Поскольку вы просили подсчет новых строк (отсюда и отдельных символов), я подумал, что быстрый тест может быть полезен для этой конкретной цели:
Поэтому я взял тестовую строку длиной 2486813, содержащую всего 78312 '\ n'. (Я в основном взял вариант файла слов OSX) и…
… Побежал [testString numberOfOccurferencesOfString: @ "\ n"] 100 раз: 19,35 с
… Побежал [testString numberOfOccurferencesOfChar: '\ n'] 100 раз: 6,91 с
(Настройка: 2,2 ГГц Core 2 Duo MacBook Pro, работающий в одном потоке)
[Редактировать: исправлена небольшая ошибка; сделал второй фрагмент метода строки категории.]