Утечка памяти в NSDictionary при присвоении ей значения - PullRequest
0 голосов
/ 31 октября 2011

Когда я закончил свое приложение для iOS и убрал утечки памяти, Я обнаружил, что прибор показывал утечку при назначении ему значений.

В файле .h я объявил NSdictionary feedData со свойством (nonatomic, retain).

У меня есть еще один класс WebServiceController, который возвращает NSdictionary.

Вот мой код. В файле .m

if ([nid rangeOfString:@","].location == NSNotFound) 
{

    NSArray *data = [[NSArray alloc]initWithObjects:nid,[NSNumber numberWithInt:0],[NSNumber numberWithInt:0],delegate1.myCity,nil];
    WebServiceController *wsct=[[WebServiceController alloc]init];
    wsct.delegate=[[UIApplication sharedApplication]delegate];
    feedData=[wsct getTimelineFeed:data];
    NSLog(@"feed data is--->%@",feedData);
    [wsct release];

}

Код "feedData = [wsct getTimelineFeed: data];" дает утечку памяти.

вот функция, которая возвращает NSDictionary.

- (NSDictionary *) MyTimelineFeed: (NSArray *) данные

{

if(![delegate sessionId] )  return nil;    

XMLRPCRequest *request = [[XMLRPCRequest alloc] initWithHost:[NSURL URLWithString:ENDPOINT]];





NSMutableArray * postParams = [NSMutableArray array];

NSString * method = [NSString stringWithFormat:@"timeline.getFeedItems"];

[postParams addObject:[delegate sessionId] ];  





for (int i = 0;  i < [data count]; i++) {

    [postParams addObject:[data objectAtIndex:i]];

}



[request setMethod:method withObject:postParams];

XMLRPCResponse *nodeSaveResponse = [XMLRPCConnection sendSynchronousXMLRPCRequest:request];


[request release];  


if([nodeSaveResponse isKindOfClass:[NSError class]])

    return nil;


NSMutableDictionary * dict = [nodeSaveResponse object];

if ([dict isKindOfClass:[NSError class]]) {
    //NSLog(@"Error found");
    return nil;
}

return dict;

}

Пожалуйста, помогите.

Ответы [ 3 ]

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

Я предполагаю, что этот метод:

feedData=[wsct getTimelineFeed:data];

возвращает NSDictionary со счетом retain, равным 1, что не должно иметь место, поскольку в соответствии с правилами управления памятью только для методов Какаокоторые начинаются с new или alloc или содержат copy, должны возвращать объекты со счетом retain, равным 1.

. Измените ваш метод следующим образом:

newTimelineFeed

И этодолжно быть хорошо идти :))

0 голосов
/ 01 ноября 2011

Вы должны использовать строку

self.feedData =[wsct getTimelineFeed:data]; 

Не

feedData =[wsct getTimelineFeed:data]; 

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

0 голосов
/ 31 октября 2011

Вы можете изменить строку:

feedData = [wsct getTimelineFeed:data];

С помощью:

feedData = [[wsct getTimelineDeed:data] retain];

Просто не забудьте освободить feedData, когда он больше не нужен.

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