программирование iphone + утечка памяти - PullRequest
0 голосов
/ 29 июня 2011

Я получаю утечку памяти theFileName = [[responseString lastPathComponent]stringByDeletingPathExtension];

theFileName - глобальная переменная.Я синтезировал его и

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
    if ((self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil]))
    {
        // Custom initialization
        theFileName = [[NSString alloc] init];
        }
    return self;
}

- (void)requestFinished:(ASIHTTPRequest *)request{

    //internally calls this function
    // Use when fetching text data
    NSString *responseString = [request responseString];
    //NSLog(@"the responsestring for download is:%@",responseString);
    theFileName = [[responseString lastPathComponent]stringByDeletingPathExtension];
    //NSLog(@"the theFileName for download is:%@",theFileName);
    //adds extension  .jpg to file name
    NSString *jpg=@".jpg";
    NSString *addjpg=[theFileName stringByAppendingString:jpg];
    //NSLog(@"append %@",addjpg);
}

выпустил его в dealloc.

-(void)dealloc
{
[thefileName release];
}
}

Ответы [ 2 ]

3 голосов
/ 29 июня 2011
theFileName = [[responseString lastPathComponent]stringByDeletingPathExtension];

создает новый объект для theFileName, который уже содержит объект NSString.Вам нужно release это старое значение ранее, то есть

[theFileName release];
theFileName = [[responseString lastPathComponent]stringByDeletingPathExtension];

Вы можете рассмотреть возможность использования свойства copy (рекомендуется) или retain для theFilename и использовать синтаксис точки в requestFinished:.

1 голос
/ 29 июня 2011

Вот несколько вещей, которые могут помочь.

  1. Вы не вызываете метод super dealloc в пределах self * dealloc. Например,

    - (void) dealloc { [self.theFileName release]; [super dealloc]; }

  2. Вы не используете геттеры и сеттеры, которые поставляются с синтезом свойства, и мы не знаем, какое свойство вы использовали с theFileName. Если у вас есть сохраняющее свойство, то есть утверждение типа @property (copy) NSString * theFileName, то вам следует использовать установщик, чтобы не запутаться в счетах удержания. Например,

    • (id) initWithNibName: (NSString *) nibNameOrNil bundle: (NSBundle *) nibBundleOrNil { if ((self = [super initWithNibName: nibNameOrNil bundle: nibBundleOrNil])) { // Пользовательская инициализация NSString * aFileName = [[NSString alloc] init]; [selfsetTheFileName: aFileName]; [релиз aFileName]; } вернуть себя; }

лучше.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...