2010-08-26 22 views
1

我在iphone上處理內存管理的方式有問題..請幫助我..我用完了想法..我試着玩下面的方法,但它開始泄漏時我正在嘗試爲對象分配字符串(例如,爲sid,first_name等分配)..我無法弄清楚如何做...這是我將從服務中獲取所有聯繫人並插入的方法它進入數據庫..它消耗更多的內存,我通過在iphone上運行分配工具和iPhone上的應用程序崩潰了,請考慮幫助我們。更好的解決方案是什麼..我認爲我的應用程序消耗更多內存,但不知道在哪裏看它..我可以發佈任何代碼,如果這不清楚..謝謝很多!iphone上的對象分配儀器

- (void) get_entry_listHandler: (id) value{ 

    NSString *salutation,*sugar_id,*first_name,*last_name,*title1,*department,*phone_home,*phone_mobile,*phone_work,*phone_other,*phone_fax,*assistant,*assistant_phone,*primary_address_street,*primary_address_city,*primary_address_state,*primary_address_postalcode,*custom; 
    NSString *primary_address_country,*alt_address_street,*alt_address_city,*alt_address_state,*alt_address_postalcode,*alt_address_country,*date_entered,*date_modified,*deleted,*do_not_call,*birthdate,*lead_source,*description,*email1,*email2,*account_name,*account_id,*id1; 

    // Handle errors 
    if([value isKindOfClass:[NSError class]]) { 
     NSLog(@"%@", value); 
     return; 
    } 

    // Handle faults 
    if([value isKindOfClass:[SoapFault class]]) { 
     NSLog(@"%@", value); 
     return; 
    }    

    // Do something with the SCRMget_entry_list_result* result 
    SCRMget_entry_list_result* result = (SCRMget_entry_list_result*)value; 
    //NSLog(@"get_entry_list returned the value: %@", result); 
    //NSLog(@"%@", result.entry_list); 
    NSLog(@"%@", result.error); 

    SCRMsugarsoap* service = [[SCRMsugarsoap alloc] initWithUrl:serverURL]; 
    SCRMentry_value* entry; 
    for(NSString * myStr in result.entry_list) { 
     entry = (SCRMentry_value*)myStr; 
     //NSLog(@"1st %@",entry.name_value_list); 
     //NSLog(@"1st %@",entry.id); 
     //NSLog(@"1st %@",entry.module_name); 

     for(NSString * myStr1 in entry.name_value_list) { 

      SCRMname_value* value1 = (SCRMname_value*)myStr1; 
      if ([value1.name isEqualToString:@"id"]) 
       sugar_id = [[NSString alloc] initWithFormat: @"%@",value1.value]; 
      else if ([value1.name isEqualToString:@"salutation"]) 
       salutation = [[NSString alloc] initWithFormat: @"%@",value1.value]; 
      else if ([value1.name isEqualToString:@"first_name"]) 
       first_name = [[NSString alloc] initWithFormat: @"%@",value1.value]; 
      else if ([value1.name isEqualToString:@"last_name"]) 
       last_name = [[NSString alloc] initWithFormat: @"%@",value1.value]; 
      else if ([value1.name isEqualToString:@"title"]) 
       title1 = [[NSString alloc] initWithFormat: @"%@",value1.value]; 
      else if ([value1.name isEqualToString:@"department"]) 
       department = [[NSString alloc] initWithFormat: @"%@",value1.value]; 
      else if ([value1.name isEqualToString:@"phone_home"]) 
       phone_home = [[NSString alloc] initWithFormat: @"%@",value1.value]; 
      else if ([value1.name isEqualToString:@"phone_mobile"]) 
       phone_mobile = [[NSString alloc] initWithFormat: @"%@",value1.value]; 
      else if ([value1.name isEqualToString:@"phone_work"]) 
       phone_work = [[NSString alloc] initWithFormat: @"%@",value1.value]; 
      else if ([value1.name isEqualToString:@"phone_other"]) 
       phone_other = [[NSString alloc] initWithFormat: @"%@",value1.value]; 
      else if ([value1.name isEqualToString:@"phone_fax"]) 
       phone_fax = [[NSString alloc] initWithFormat: @"%@",value1.value]; 
      else if ([value1.name isEqualToString:@"assistant"]) 
       assistant = [[NSString alloc] initWithFormat: @"%@",value1.value]; 
      else if ([value1.name isEqualToString:@"assistant_phone"]) 
       assistant_phone = [[NSString alloc] initWithFormat: @"%@",value1.value]; 
      else if ([value1.name isEqualToString:@"primary_address_street"]) 
       primary_address_street = [[NSString alloc] initWithFormat: @"%@",value1.value]; 
      else if ([value1.name isEqualToString:@"primary_address_city"]) 
       primary_address_city = [[NSString alloc] initWithFormat: @"%@",value1.value]; 
      else if ([value1.name isEqualToString:@"primary_address_state"]) 
       primary_address_state = [[NSString alloc] initWithFormat: @"%@",value1.value]; 
      else if ([value1.name isEqualToString:@"primary_address_postalcode"]) 
       primary_address_postalcode = [[NSString alloc] initWithFormat: @"%@",value1.value]; 
      else if ([value1.name isEqualToString:@"primary_address_country"]) 
       primary_address_country = [[NSString alloc] initWithFormat: @"%@",value1.value]; 
      else if ([value1.name isEqualToString:@"alt_address_street"]) 
       alt_address_street = [[NSString alloc] initWithFormat: @"%@",value1.value]; 
      else if ([value1.name isEqualToString:@"alt_address_city"]) 
       alt_address_city = [[NSString alloc] initWithFormat: @"%@",value1.value]; 
      else if ([value1.name isEqualToString:@"alt_address_state"]) 
       alt_address_state = [[NSString alloc] initWithFormat: @"%@",value1.value]; 
      else if ([value1.name isEqualToString:@"alt_address_postalcode"]) 
       alt_address_postalcode = [[NSString alloc] initWithFormat: @"%@",value1.value]; 
      else if ([value1.name isEqualToString:@"alt_address_country"]) 
       alt_address_country = [[NSString alloc] initWithFormat: @"%@",value1.value]; 
      else if ([value1.name isEqualToString:@"date_entered"]) 
       date_entered = [[NSString alloc] initWithFormat: @"%@",value1.value]; 
      else if ([value1.name isEqualToString:@"date_modified"]) 
       date_modified = [[NSString alloc] initWithFormat: @"%@",value1.value]; 
      else if ([value1.name isEqualToString:@"deleted"]) 
       deleted = [[NSString alloc] initWithFormat: @"%@",value1.value]; 
      else if ([value1.name isEqualToString:@"do_not_call"]) 
       do_not_call = [[NSString alloc] initWithFormat: @"%@",value1.value]; 
      else if ([value1.name isEqualToString:@"birthdate"]) 
       birthdate = [[NSString alloc] initWithFormat: @"%@",value1.value]; 
      else if ([value1.name isEqualToString:@"lead_source"]) 
       lead_source = [[NSString alloc] initWithFormat: @"%@",value1.value]; 
      else if ([value1.name isEqualToString:@"description"]) 
       description = [[NSString alloc] initWithFormat: @"%@",value1.value]; 
      else if ([value1.name isEqualToString:@"email1"]) 
       email1 = [[NSString alloc] initWithFormat: @"%@",value1.value]; 
      else if ([value1.name isEqualToString:@"email2"]) 
       email2 = [[NSString alloc] initWithFormat: @"%@",value1.value]; 
      else if ([value1.name isEqualToString:@"account_name"]) 
       account_name = [[NSString alloc] initWithFormat: @"%@",value1.value]; 


      else if ([value1.name isEqualToString:@"account_id"]) 
       account_id = [[NSString alloc] initWithFormat: @"%@",value1.value]; 
      else 
       custom = [[NSString alloc] initWithFormat: @"%@",value1.value]; 
      } 

     NSDateFormatter *df = [[NSDateFormatter alloc] init]; 
     [df setFormatterBehavior:NSDateFormatterBehavior10_4]; 
     [df setDateFormat:@"yyy-MM-dd HH:mm:ss"]; 
     NSDate *date_moded = [df dateFromString:date_modified]; 
     NSDate *lastSync = [df dateFromString:lastSyncTime]; 
     NSDate *date_enter = [df dateFromString:date_entered]; 
     [df release]; 

     if ([[date_moded laterDate:lastSync]isEqualToDate:date_moded] && lastSyncTime != nil && [date_enter isEqualToDate:date_moded]) 
      id1 = [[NSString alloc]initWithFormat:@"%d",primaryKeyCount]; 
     else if ([[date_moded laterDate:lastSync]isEqualToDate:date_moded] && lastSyncTime != nil) 
      id1 = [db getPrimaryKey:sugar_id]; 
     else 
      id1 = [[NSString alloc]initWithFormat:@"%d",primaryKeyCount]; 

     [db insertRecordIntoTableNamed: @"Contacts" withField1: @"id" field1Value: id1 andField2: @"sugar_id" field2Value: sugar_id 
         andField3: @"salutation" field3Value: salutation andField4: @"first_name" field4Value: first_name 
         andField5: @"last_name" field5Value: last_name andField6: @"title" field6Value: title1 
         andField7: @"department" field7Value: department andField8: @"phone_home" field8Value: phone_home 
         andField9: @"phone_mobile" field9Value: phone_mobile andField10: @"phone_work" field10Value: phone_work 
         andField11: @"phone_other" field11Value: phone_other andField12: @"phone_fax" field12Value: phone_fax 
         andField13: @"assistant" field13Value: assistant andField14: @"assistant_phone" field14Value: assistant_phone 
         andField15: @"primary_address_street" field15Value: primary_address_street andField16: @"primary_address_city" field16Value: primary_address_city 
         andField17: @"primary_address_state" field17Value: primary_address_state andField18: @"primary_address_postalcode" field18Value: primary_address_postalcode 
         andField19: @"primary_address_country" field19Value: primary_address_country andField20: @"alt_address_street" field20Value: alt_address_street 
         andField21: @"alt_address_city" field21Value: alt_address_city andField22: @"alt_address_state" field22Value: alt_address_state 
         andField23: @"alt_address_postalcode" field23Value: alt_address_postalcode andField24: @"alt_address_country" field24Value: alt_address_country 
         andField25: @"date_entered" field25Value: date_entered andField26: @"date_modified" field26Value: date_modified 
         andField27: @"deleted" field27Value: deleted andField28: @"do_not_call" field28Value: do_not_call 
         andField29: @"birthdate" field29Value: birthdate andField30: @"lead_source" field30Value: lead_source 
         andField31: @"description" field31Value: description andField32: @"email1" field32Value: email1 
         andField33: @"email2" field33Value: email2 andField34: @"account_name" field34Value: account_name 
         andField35: @"account_id" field35Value: account_id andField36: @"custom" field36Value: custom]; 
     primaryKeyCount++; 
     currentCount++; 
     //NSLog(@"%D",i); 
    } 
    [salutation release]; 
    [sugar_id release]; 
    [first_name release]; 
    [last_name release]; 
    [title1 release]; 
    [department release]; 
    [phone_home release]; 
    [phone_mobile release]; 
    [phone_work release]; 
    [phone_fax release]; 
    [phone_other release]; 
    [assistant release]; 
    [assistant_phone release]; 
    [primary_address_street release]; 
    [primary_address_city release]; 
    [primary_address_state release]; 
    [primary_address_postalcode release]; 
    [primary_address_country release]; 
    [alt_address_street release]; 
    [alt_address_city release]; 
    [alt_address_state release]; 
    [alt_address_postalcode release]; 
    [alt_address_country release]; 
    [custom release]; 
    [date_entered release]; 
    [deleted release]; 
    [do_not_call release]; 
    [birthdate release]; 
    [lead_source release]; 
    [description release]; 
    [email1 release]; 
    [email2 release]; 
    [account_name release]; 
    [account_id release]; 

    float expected = (float) contactEntries; 
    float gotSoFar = (float) currentCount; 


    syncViewController.progressView.progress = ((float)((gotSoFar - 1)/(expected + 1))); 
    syncViewController.progressLabel.text=[NSString stringWithFormat:@"Syncing %d Contacts",contactEntries]; 

    NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; 
    integer = [NSNumber numberWithInt:primaryKeyCount]; 
    [defaults setObject:integer forKey:@"primaryKeyCount"]; 
    [defaults synchronize]; 

    moduleViewController.db = db; 
    int a = result.next_offset; 
    int b = contactEntries; 
    while (result.result_count == 20 /*&& result.next_offset < contactEntries*/) { 
     if (lastSyncTime == nil) { 
      [service get_entry_list:self action:@selector(get_entry_listHandler:) session:sessionId module_name: @"Contacts" query: @"" order_by: @"" offset: result.next_offset select_fields: [[[SCRMselect_fields alloc] init]autorelease] max_results: contactEntries deleted: 0]; 
      [service release]; 
      return; 
      //break; 
     } 
     else { 
      [service get_entry_list:self action:@selector(get_entry_listHandler:) session:sessionId module_name: @"Contacts" query: finalQuery order_by: @"" offset: result.next_offset select_fields: [[[SCRMselect_fields alloc] init]autorelease] max_results: contactEntries deleted: 0]; 
      [service release]; 
      return; 
      //break; 
     } 
    } 

    if (a >= b) { 
     [UIApplication sharedApplication].networkActivityIndicatorVisible = NO; 
     [settingsViewController.navigationController pushViewController:moduleViewController animated:YES]; 
     NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; 
     [defaults setBool:NO forKey:@"reset"]; 
     [defaults synchronize]; 
     [finalQuery release]; 
    } 
    /*else if (a >= b && syncing == YES) { 
     [UIApplication sharedApplication].networkActivityIndicatorVisible = NO; 
     [moduleViewController reload]; 
    }*/ 

    [service release]; 
    [id1 release]; 

} 

編輯:

我擺脫了所有的泄漏,但任何一個可以請告訴我如何檢查iphone..Please對象分配儀器看到下面的screenshot..My應用得到一旦它加載所有的4200聯繫人並且聯繫人永遠不會顯示在桌面視圖上時崩潰。什麼可能是問題..我確保聯繫人保存到數據庫的位置是無泄漏的。在下面截圖究竟應該尋找什麼..這是總分配或生活..請讓我知道的人..我完全精疲力竭..感謝你的時間很多.. alt text

回答

3

你應該把[string release]; for(NSString * myStr in result.entry_list)循環中的行。每次調用alloc時,都必須有相應的釋放呼叫。

更好的方法是使用[NSString stringWithFormat:]而不是[[NSString alloc] initWithFormat:],這樣就不需要手動釋放它們。

我的應用程序被撞壞,一旦它加載所有 4200個觸點和觸點 永遠顯示在上表視圖viewnever顯示的表

4200接觸讓你的循環「大緊」 。正如taskinoor所建議的那樣,您可以爲每幾個循環創建並排出NSAutoreleasePool,以減少內存足跡。例如:

int counter = 0; 
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; 
for (...) { 
    if (++counter == 100) { 
     counter = 0; 
     [pool release]; 
     pool = [[NSAutoreleasePool alloc] init]; 
    } 
    //busy working... 
} 
[pool release]; 

如果響應系統事件花費太長時間,您的應用程序也可能被iOS終止。這種機制被稱爲看門狗超時。在這種情況下,您會在崩潰報告中找到異常代碼0x8badf00d。您可能希望將工作分成較小批次或使用輔助線程,以便主線程不會太忙。

+0

你確實不應該在檢查其他答案後編輯你的答案。或者至少指定您已從其他答案複製。這是一種怯懦的行爲。 – taskinoor 2010-08-26 16:00:26

+0

我編輯的截圖..請指導我的朋友.. – racharambola 2010-08-26 18:56:28

+1

@taskinoor:你真的認爲使用便利構造的想法是你的原始概念,你downvote不信任你的答案嗎?因爲你擔心他們可能會從你的投票中回答好的答案比將一個好主意融入你的答案更怯懦。我不會讓你失望,因爲你的回答也是正確的,但是請儘量不要對其他用戶那麼積極。重點是幫助有問題的人,而不是「擊敗」其他用戶。 – Chuck 2010-08-26 19:18:21

2

這是一段很長的代碼,可能是我錯了。但我的猜測是這樣的。

 
for(NSString * myStr in result.entry_list) { 
    // lots of alloc 
} 
// releases in this point 

現在,如果你有result.entry_list(我想你有)多個條目,你不泄露的字符串?假設你已經在第一回閤中獲得了分數,並且在下一次分配時你正在泄漏這個數據。明白了我的觀點?

如果這是問題,那麼你應該在循環內移動釋放調用。

另一個解決方案是,似乎你不需要這個範圍以外的字符串。那麼爲什麼你不使用autorealse方法來創建它?

str = [NSString stringWithFormat:@"what_you_need"];

您現在不需要釋放它們。儘管在這種情況下,您應該考慮創建自己的自動釋放池,因爲數據量可能很大。

+0

感謝您的答覆..我會嘗試它並讓你知道.. – racharambola 2010-08-26 15:54:44

+0

我編輯的截圖..請引導我的朋友。 – racharambola 2010-08-26 18:57:04