NSDictionary在为其赋值时发生内存泄漏

时间:2011-10-31 11:53:14

标签: iphone objective-c cocoa-touch

因为我已经完成了我的iOS App并且正在消除内存泄漏, 我发现仪器在为其分配值时显示泄漏。

在.h文件中,我已经使用属性声明了NSdictionary feedData(非原子,保留)。

我还有一个类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 个答案:

答案 0 :(得分:2)

我假设这个方法:

feedData=[wsct getTimelineFeed:data];

返回一个retain计数为1的NSDictionary,情况并非如此,因为根据Cocoa的内存管理规则,只有以newalloc开头的方法或包含copy应返回retain计数为1的对象。

将您的方法更改为:

newTimelineFeed

这应该是好的:)

答案 1 :(得分:0)

您应该使用

self.feedData =[wsct getTimelineFeed:data]; 

feedData =[wsct getTimelineFeed:data]; 

我看不到其余代码中的任何泄漏,但是由于您没有通过合成访问器,因此可能失去对先前分配的变量的引用 - 使用self.feedData将释放任何先前保持的值在保留新的ivar之前,在ivar中直接分配值不会这样做。

答案 2 :(得分:-2)

您可以更改以下行:

feedData = [wsct getTimelineFeed:data];

使用:

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

请记住在不再需要时释放feedData。