NSString alloc вне пула автоматического выпуска создает таинственную утечку памяти? - PullRequest
1 голос
/ 11 сентября 2011

следующая ошибка возникает во время выполнения при ручном выделении и освобождении памяти:

objc[10430]: Object 0x109014b60 of class __NSCFData autoreleased with no pool in place - just leaking - break on objc_autoreleaseNoPool() to debug

Я искал в интернете, но обычно эти ошибки вызваны не освобождением памяти или использованием автоматически выпущенных сокращений ... Я не могу найтиЛюбая неизданная память, и при этом я не использую автоматически выпущенную стенографию ... Надеюсь, вы можете помочь!

Мой код:

#import "try.h"

@implementation try

- (try*)initWithSwing
{
    self = [super init];
    if (self) {
        [self tellAboutSwing:YES];
    }

    return self;
}

- (void) tellAboutSwing: (BOOL) swing {

    NSString *s = [[NSString alloc] initWithFormat: @"%@ %@", @"Do we have a swing on our playground?", (swing ? @"Yes" : @"No")];


    // cast to a char
    const char *c = [s UTF8String];
    [s release];    
    printf("%s", c);

}

- (void) dealloc {
    printf( "Deallocing Playground\n" );
    [super dealloc];
}

int main(void) {
    try *t;
    t = [[try alloc] initWithSwing];
    [t release];
}

@end

Помещение пула автоматического выпуска в метод экземпляра решает проблему,но это не должно быть необходимо с NSString alloc.Хотя я новичок в Objective-C, я думаю, что понял концепцию владения и освобождения переменных, но у меня возникают трудности с поиском моей ошибки здесь.

Вот мой файл .h:

#include <Foundation/Foundation.h>


@interface try : NSObject
- (void) tellAboutSwing: (BOOL) swing;
@end

Помощь будет принята с благодарностью:)

С уважением,

Роберт

Ответы [ 2 ]

5 голосов
/ 11 сентября 2011

IIRC -[NSString UTF8String] использует автоматически выпущенный NSData для фактического хранения байтов строки UTF-8 C.

Обновление: вот более простой способ с использованием только функций C:

- (void) tellAboutSwing: (BOOL) swing {    
    printf("%s %s", "Do we have a swing on our playground?", (swing ? "Yes" : "No"));
}
1 голос
/ 17 января 2012

Вы должны просто использовать NSAutoreleasePool.Это нормально, и в какой-то момент вы не найдете альтернативы, которая не создает автоматически выпущенные объекты для внутреннего использования.

Я думаю, вам следует проверить некоторые учебные пособия и руководства по управлению памятью и основам, в противном случае вы будетеВам трудно понять Objective-C.

Например, на iTunesU есть отличный бесплатный курс, который объясняет основы Objective-C.

...