Проблема утечки памяти NSAutoreleaseNoPool () - PullRequest
0 голосов
/ 30 ноября 2010

Я пытаюсь создать неизменную строку. Я не инициализирую его с помощью 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 ]

8 голосов
/ 30 ноября 2010

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

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

    NSMutableString *srn = [NSMutableString stringwithCString:devSID];

    // etc...

    [pool release];
}
0 голосов
/ 30 ноября 2010

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

[[NSString stringWithCString: "Hello"] retain];

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

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

...