Создание длинной строки NSString, вызывающей проблемы с памятью - PullRequest
3 голосов
/ 28 марта 2011

Мой код, приведенный ниже, приводит к тому, что мое приложение завершает работу, т.е. получает черный экран и затем видит в консоли отладчика: Программа получила сигнал: «0».

В основном это вызывает проблемы, когда мой orderArray имеет счет 2000 или более. Я использую iPhone 3GS с iOS 4.2

Вопрос: Есть ли более эффективный и менее потребляющий память способ создания моего long outStr?

NSString *outStr = @"";

for (int i = 0; i < count; i++) {
    NSDictionary *dict = [[ARAppDelegate sharedAppDelegate].orderArray objectAtIndex:i];
    outStr = [outStr stringByAppendingFormat:@"%@,%@,%@,%@\n", 
              [dict valueForKey:@"CODE"], 
              [dict valueForKey:@"QTY"],
              [[ARAppDelegate sharedAppDelegate].descDict valueForKey:[dict valueForKey:@"CODE"]],
              [[ARAppDelegate sharedAppDelegate].priceDict valueForKey:[dict valueForKey:@"CODE"]]];

}

Обновление: спасибо очень добрым людям, которые помогли, ниже мой модифицированный код:

NSArray *orderA = [ARAppDelegate sharedAppDelegate].orderArray;
NSDictionary *descD = [ARAppDelegate sharedAppDelegate].descDict;
NSDictionary *priceD = [ARAppDelegate sharedAppDelegate].priceDict;
NSMutableString *outStr = [[[NSMutableString alloc] init] autorelease];
for (int i = 0; i < [orderA count]; i++) {
    NSDictionary *dict = [orderA objectAtIndex:i];
            NSString *code = [dict valueForKey:@"CODE"];
    [outStr appendFormat:@"%@,%@,%@,%@\n", 
              code, 
              [dict valueForKey:@"QTY"],
              [descD valueForKey:code],
              [priceD valueForKey:code]];
}


[self emailTxtFile:[NSString stringWithString:outStr]]; 

// Это достигает конца метода

1 Ответ

5 голосов
/ 28 марта 2011

Проблема в том, что на каждой итерации формируется новый строковый объект.Это занимает много памяти.Одним из решений может быть использование локального автозапуска, но здесь это довольно сложно.

Вы должны использовать NSMutableString, например:

NSMutableString *outStr = [[[NSMutableString alloc] init] autorelease];
for (int i = 0; i < count; i++) {
    NSDictionary *dict = [[ARAppDelegate sharedAppDelegate].orderArray objectAtIndex:i];
    [outStr appendFormat:@"%@,%@,%@,%@\n", 
          [dict valueForKey:@"CODE"], 
          [dict valueForKey:@"QTY"],
          [[ARAppDelegate sharedAppDelegate].descDict valueForKey:[dict valueForKey:@"CODE"]],
          [[ARAppDelegate sharedAppDelegate].priceDict valueForKey:[dict valueForKey:@"CODE"]]];
}

Тогда вы можете использовать outStr, простокак будто это был NSString.Как отмечает Том в комментариях, вы можете превратить NSMutableString в NSString, когда закончите, используя:

NSString *result = [NSString stringWithString:outStr];

[outStr release]; // <-- add this line and remove the autorelease
                  //     from the outStr alloc/init line

, делая ваш код многократно используемым и более простым в обслуживании.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...