因为我已经完成了我的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;
}
请帮助。
答案 0 :(得分:2)
我假设这个方法:
feedData=[wsct getTimelineFeed:data];
返回一个retain
计数为1的NSDictionary,情况并非如此,因为根据Cocoa的内存管理规则,只有以new
或alloc
开头的方法或包含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。