утечка памяти разработки iphone - PullRequest
1 голос
/ 07 апреля 2011

У меня есть функция ниже, которая возвращает выделенную память

- (NSString *) getBlock
{
    NSString *block = [[NSString alloc] int];
    ....... doing something over here
    return block;
}

// I have the class interface like this
@interface myDataDetail : NSObject {
    NSString *myName;
    NSString *myMarks;
}

dealloc {
    myName release;
    myMarks release;

    [super dealloc];    
}

Я делаю следующие вещи

myDataDetail *detail = [[myDataDetail alloc] init];
detail.myName = [self getBlock]; //here leak
detail.myMarks = [self getBlock]; //here leaak

.... делаю кое-что здесь

[detail release];

Когда я запускаю приложение с утечкой памяти инструментов, я получаю сообщения об утечках в режиме онлайн.Что я здесь не так делаю?Может кто-нибудь, пожалуйста, дайте мне знать правильный способ реализации этой структуры.

Ответы [ 3 ]

1 голос
/ 07 апреля 2011

Например, getBlock должен автоматически выпустить:

- (NSString *) getBlock
{
    NSString *block = [[[NSString alloc] int]autorelease];
    ....... doing soemthing over here
    return block;
}

Поскольку это геттер, он не должен сохранять.Хотя он не должен освобождаться, потому что это гарантирует, что возвращаемая ссылка недействительна.

Свойства, сопровождающие ваши два поля, должны быть определены как копируемые или сохраняемые.В вашем случае, поскольку они являются NSStrings, лучше установить их для копирования:

@property(nonatomic,copy) NSString *myName;
@property(nonatomic,copy) NSString *myMarks;
0 голосов
/ 28 января 2013
- (NSString *) getBlock
{
    NSString *block =[ [[NSString alloc] int]autorelease];

    return block;
}
0 голосов
/ 07 апреля 2011

В вашей функции getBlock вы должны автоматически высвобождать объект перед возвратом:

- (NSString *) getBlock
{
    NSString *block = [[NSString alloc] int];
    ....... doing soemthing over here
    [block autorelease];
    return block;
}

Это отменяет «владение» этой функцией, но не уничтожает ее немедленно, чтобы функция, обращающаяся к ней, могла требовать »владение "

. Основное правило управления памятью состоит в том, что всякий раз, когда вы вызываете" alloc ", вы должны иметь одинаковые вызовы функции / объекта" release "или" autorelease "в какой-то момент до того, как указатель на объект станетуничтожены.Так как это в одной функции и вы не храните указатель в классе, вам нужно сразу же его освободить.

...