Проблема утечки памяти 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];
}