2011-10-04 132 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]; 

然後就沒有必要釋放它了。這應該可以解決你的問題。