2010-08-26 4 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]; 

} 

EDIT:

Я избавилась от всех утечек, но может ли один пожалуйста, скажите мне, как проверить прибор при распределении объектов в iphone..Please см ниже screenshot..My приложение получает разбился, когда он загружает все контакты 4200, и контакты никогда не отображаются в представлении таблицы. Какая может быть проблема. Я уверен, что место, из которого мои контакты сохранены в базе данных, является утечкой. скриншот, что именно я должен искать .. это общее распределение или живое..пожалуйста, дайте мне знать, ребята. Я полностью измучен. Это многое для вашего времени. alt text

ответ

3

Вы должны положить [освобождение струны]; строк внутри цикла 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]; 

Ваше приложение также может быть прекращено прошивкой, если он занимает слишком много времени, чтобы реагировать на системные события. Этот механизм известен как тайм-аут сторожевого таймера. В этом случае вы найдете код исключения 0x8badf00d в отчете о сбое. Вы можете разбить работу на более мелкие партии или использовать вторичный поток, чтобы основной поток не был слишком занят.

+0

Вы действительно не должны редактировать свой ответ после проверки других ответов. Или, по крайней мере, укажите, что вы скопировали из другого ответа. Это поведение трусости. – taskinoor

+0

Я отредактировал скриншот..пожалуйста, помогите мне с друзьями .. – racharambola

+1

@taskinoor: Вы действительно думаете, что идея использования конструктора удобства была такой оригинальной вашей концепцией, что вы отвечаете на вопросы, которые не приписывают вам это? Даунвотирование хороших ответов, потому что вы обеспокоены тем, что они могут принимать голоса от вас, более трусливы, чем включение хорошей идеи в ваш ответ. Я не собираюсь понижать вас, потому что ваш ответ также верен, но, пожалуйста, старайтесь не быть настолько агрессивным по отношению к другим пользователям. Дело в том, чтобы помочь человеку с вопросом, а не «бить» других пользователей. – Chuck

2

Это длинный код, и, возможно, я ошибаюсь. Но я думаю, это так.

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

Теперь, если у вас есть более чем одна запись в result.entry_list (который я предполагаю, что у вас есть), вы не утечка строки? Скажем, вы выделили str в 1-м проходе, а во втором проходе во время следующего выделения вы пропустите это. Понял?

Если это проблема, вы должны переместить вызовы освобождения в цикле.

Другое решение состоит в том, что вам не нужны строки вне этой области. Так почему бы вам не использовать метод autorealse для его создания?

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

Вам не нужно выпускать их сейчас. Хотя в этом случае вам следует подумать о создании собственного пула авторасчетов, поскольку объем данных может быть огромным.

+0

спасибо за ответ .. Я попробую и дайте знать .. – racharambola

+0

Я отредактировал скриншот..пожалуйста, направляйте друзей. – racharambola

Смежные вопросы