2012-10-25 28 views
0

我有一個示例應用程序,看起來像社交網絡iOS應用程序。我是可可框架的新手,所以我正在研究示例代碼。在進行分析時,應用程序中有255個報告的內存泄漏。我能夠解決大約100個非常簡單的泄漏問題,但是我無法解決其餘問題。複製對象時目標內存泄漏

- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict{ 
    //DLog(@"found this element: %@", elementName); 
    currentElement = [elementName copy]; 
    if([MethodName isEqualToString:@"SignInStep"]) 
    { 

     if ([elementName isEqualToString:@"item"]) 
     { // clear out our story item caches... 
      item = [[NSMutableDictionary alloc] init]; 
      currentUserId = [[NSMutableString alloc] init]; 

      currentError = [[NSMutableString alloc] init]; 
     } 

    } 

} 

的該項目的變量分配:

- (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName{ 
    //DLog(@"ended element: %@", elementName); 

    if([MethodName isEqualToString:@"SignInStep"]) 
    { 
     if ([elementName isEqualToString:@"item"]) 
     { // save values to an item, then store that item into the array... 
      [item setObject:currentUserId forKey:@"userId"]; 

      [item setObject:currentError forKey:@"error"]; 

      [SignIn addObject:[item copy]]; //Method returns Objective C Object with +1 retain count 

     } 
    } 

}//Object leaked: allocated object is not referenced later in this execution path and has a retain count of +1 

我收到以下錯誤:

1)方法返回目標C與對象+1保留計數

2 )對象泄漏:分配的對象未在此執行路徑中引用,並且保留計數爲+1

我在上面的代碼中提到了我剛剛收到這些泄漏的地方。誰能告訴我這是什麼原因?

回答

1

你必須放棄對象的所有權您擁有

id obj = [item copy]; 
[SignIn addObject:obj]; // SignIn will retain obj 
[obj release]; 

看看Memory Management Programming Guide

 item = [[NSMutableDictionary alloc] init]; // release this object 
     currentUserId = [[NSMutableString alloc] init]; // release this object 

     currentError = [[NSMutableString alloc] init]; // release this object 
+0

感謝@parag Bafna。它的工作,但我真的不明白我們的代碼..你可以請詳細說明代碼 – Srini

+0

當你添加一個對象到數組時,它會調用該對象的保留。 –

0

每一個頁頭,保留,拷貝調用應具有相當於釋放呼叫。 正如您在didStartElement中分配項目currentUserId和currentError。它們應該在某些地方發佈,根據您的代碼,它將主要位於didEndElement中:

請記住,只要將對象添加到數組或字典中,對象就會被保留。只要發佈數組(或)字典,這些對象就會被釋放。

id obj = [item copy]; // obj retaincount +1

[SignIn addObject:obj]; // obj retaincount +1

[obj release]; // OBJ retaincount-1

簽到時被釋放,OBJ保留計數將變爲0。

0

相關內存泄漏的一些更多的積分。 每個人都應該遵循這些規則,以避免內存泄漏:

你擁有的任何對象創建

您創建使用名稱以「黃金」,「新」,「複製」對象的方法,或「mutableCopy」(例如,alloc,newObject或mutableCopy)。

可以使用保留採取對象的所有權

一個接收的對象通常是保證其接收的方法中仍然有效,而且方法也可以安全地將對象返回到它的調用。在兩種情況下使用retain:(1)在實現訪問方法或init方法時,將要存儲的對象的所有權作爲屬性值; (2)爲了防止物體被無效一些其他操作的副作用

當你不再需要它,你必須放棄你自己的對象的所有權

你放棄所有權通過發送釋放消息或自動釋放消息來向對象發送消息。

你一定不會放棄對象的所有權不屬於您

參考:apple documents