2011-10-04 125 views
0

我正在使用带有参数的字典发送到Web服务。我不断收到内存泄漏,但我做了一个对象释放。我的代码:objective-c内存泄漏+ NSMutableDictionary

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]; 

任何想法?谢谢!!

+0

您并未发布webService。通常会使用setObject而不是setValue,尽管这不会导致泄漏。 –

回答

1

你在某个时候发布了你的webService对象吗? AsyncWebServiceController的委托也是一个分配或保留的属性?代表通常应该被分配属性以避免保留循环。

2

您应该使用:

- (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

+0

为什么'setObject:forKey:'而不是'setValue:forKey:',都是NSDictionary上的方法?我明白'setValue:forKey:'调用'setObject:forKey:'和删除语义,但是它适用于这里的问题吗? – zaph

+1

没有'setValue:forKey:'是'NSObject'的方法,''setObject:forKey:'是'NSMutableDictionary'的一个方法更多信息:http://stackoverflow.com/questions/1062183/objective-c-whats-对象之间的差异-for-key-and-valueforkey – rckoenes

+0

是的,不在头文件!在组织者的文档查看器的iOS中,它具有'setValue:forKey'作为路径中的实例方法:“iOS 5.0库>数据管理>数据类型和集合> NSMutable类参考”(选项双击“NSMutableDictionary” iOS的Xcode文件,所以,似乎苹果的文档是错误的,我会提交一个bug。谢谢! – zaph

2

用分析构建。这可能会给一些指示。

外的是:

  1. 您在AsyncWebServiceController调用页头做你自己,但上面的代码不会释放。
  2. 您应该调用setObject:forKey而不是setValue:ForKey。 setValue适用于KVC。
2

为什么不使用便利构造函数?

NSMutableDictionary *params = [NSMutableDictionary dictionary]; 

然后就没有必要释放它了。这应该可以解决你的问题。