Проблема утечки памяти NSAutoreleaseNoPool()

Я пытаюсь создать неизменную строку. Я не инициализирую его с помощью init, alloc или new, но память по-прежнему протекает, и здесь говорится, что "объект 0x234b533 класса NSCFString автоматически освобожден без пула на месте - просто утечка" - вот что я пытаюсь сделать

NSMutableString *srn = [NSMutableString stringwithCString:devSID];

// devSID is *char

это оставляет утечку. Я тоже пробовал

NSMutableString *srn = [NSMutableString stringwithCString:devSID length:sizeof(devSID)];

но это тоже не работает, однако, если я попытаюсь инициализировать его с простой строкой, как это

NSMutableString *srn = @"this is my string";

это работает, понятия не имею, что происходит вокруг. Я не использую init или alloc, но все же есть утечка. Я был бы признателен, если кто-нибудь может помочь мне решить эту проблему

С уважением

Umair

2 ответа

Решение

Попробуйте что-то вроде этого

[[NSString stringWithCString:"Hello"] сохранить];

retain - это способ оценки принадлежности объекта к объектам, которые вы изначально не создавали, так что это расширяет наше правило соответствия каждого alloc с выпуском или autorelease

Примечание: вы должны сбалансировать количество выпусков, если вы сохраните этот объект. Если вы не отпустите сохраненный объект, то вы столкнетесь с проблемой утечки памяти.

Утечка вызвана вашим автоматическим выпуском объекта без наличия пула автоматического выпуска, чтобы позаботиться о нем. Это обычно происходит, когда вы делаете что-то отдельно от основного потока, создавая свои собственные потоки или просто используя -performSelectorInBackground:withObject: удобный метод. Если вы хотите использовать функцию автоматического выпуска (подразумевается использование NSMutableString метод класса здесь), вам нужно создать пул авто-релиза в начале блока кода, где вы будете его использовать, и опустошить его в конце. Другими словами, что-то вроде этого:

- (void)myBackgroundThing:(id)whatever
{
    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];

    NSMutableString *srn = [NSMutableString stringwithCString:devSID];

    // etc...

    [pool release];
}
Другие вопросы по тегам