утечка памяти в target-c + NSMutableDictionary - PullRequest
0 голосов
/ 04 октября 2011

Я использую словарь с параметрами для отправки на веб-сервис. Я продолжаю получать утечки памяти от этого, хотя я делаю выпуск для объекта. Мой код:

 NSUserDefaults *prefs = [NSUserDefaults standardUserDefaults];

// getting an NSString
NSString *clientID = [prefs stringForKey:@"ClientID"];



//Call web service
id delegate1 = self;
AsyncWebServiceController * webService = [[[AsyncWebServiceController alloc] initWithDelegate:delegate1
                                                                                 selSucceeded:@selector(webServiceConnectionSucceeded:)
                                                                                    selFailed:@selector(webServiceconnectionFailed:)] autorelease];


NSMutableDictionary *params = [[NSMutableDictionary alloc] init]; //Memory leak here
[params setValue:clientID forKey:@"clientId"]; //Memory leak here
[params setValue:[self.jobDetails objectForKey:@"BoardId"] forKey:@"jobBoardId"];
[params setValue:[self.jobDetails objectForKey:@"Id"] forKey:@"jobId"];

[webService startRequest:@"JobReviewGet" parameters:params];

[params release];

Есть идеи? Спасибо !!

Ответы [ 4 ]

2 голосов
/ 04 октября 2011

Почему вы не используете удобный конструктор?

NSMutableDictionary *params = [NSMutableDictionary dictionary]; 

Тогда не было бы необходимости выпускать его. Это должно решить вашу проблему.

2 голосов
/ 04 октября 2011

Вы должны использовать:

- (void)setObject:(id)anObject forKey:(id)aKey;

Таким образом, ваш код должен выглядеть так: "

NSMutableDictionary *params = 
[[NSMutableDictionary alloc] init]; //Memory leak here
[params setObject:clientID forKey:@"clientId"]; //Memory leak here
[params setObject:[self.jobDetails objectForKey:@"BoardId"] forKey:@"jobBoardId"];
[params setObject:[self.jobDetails objectForKey:@"Id"] forKey:@"jobId"];

[webService startRequest:@"JobReviewGet" parameters:params];

[params release];

Что метод [webService startRequest:@"JobReviewGet" parameters:params]; делает с параметром, сохраняет ли он его?Если это так, вам также нужно отпустить его там.

Также в какой-то момент вам нужно будет отпустить webService.

2 голосов
/ 04 октября 2011

Сборка с анализом. Это может дать некоторые указания.

За пределами этого:

  1. Вы вызываете alloc на AsyncWebServiceController, владеете ли вы им, но приведенный выше код не освобождает.
  2. Вы должны вызывать setObject: forKey вместо setValue: ForKey. setValue для KVC.
1 голос
/ 04 октября 2011

Вы когда-нибудь выпускаете свой объект webService?Является ли делегат AsyncWebServiceController назначенным или сохраненным свойством?Делегатам обычно следует назначать свойства, чтобы избежать сохранения циклов.

...