Инструмент распределения объектов на iphone - PullRequest
1 голос
/ 26 августа 2010

У меня проблема с тем, как я отношусь к управлению памятью в iphone. Пожалуйста, помогите мне. У меня заканчиваются идеи. Я пытался поиграть с помощью описанного ниже метода, но он начал течь, когда я пытался выделитьстроки для объектов (например, распределение для sid, first_name и т. д.) .. Я не могу понять, как это сделать ... и это метод, где я получу все контакты из службы и вставлю их в базу данных.Он потребляет больше памяти, что я выяснил, запустив инструмент выделения ресурсов на 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 .. Пожалуйста, смотрите скриншот ниже .. Мое приложение падает, как только он загружает все 4200 контактов иконтакты никогда не отображаются в табличном представлении .. В чем может быть проблема .. Я удостоверяюсь, что место, из которого мои контакты сохраняются в базе данных, не имеет утечек .. На скриншоте ниже, что именно я должен искать ...это общее распределение или проживание .. пожалуйста, дайте мне знать, ребята .. я полностью измучен .. большое спасибо за ваше время .. alt text

Ответы [ 2 ]

3 голосов
/ 26 августа 2010

Вы должны поставить [string release];строки внутри цикла for (NSString * myStr in result.entry_list).Каждый раз, когда вы вызываете alloc, должен быть соответствующий вызов release.

Лучший способ сделать это - использовать [NSString stringWithFormat:] вместо [[NSString alloc] initWithFormat:], чтобы вы не делали этого.нужно отпустить их вручную.

Мое приложение зависает после загрузки всех 4200 контактов, и контакты никогда не отображаются в представлении таблицы, никогда не отображаются в представлении таблицы

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 в отчете о сбое.Возможно, вы захотите разбить работу на меньшие партии или использовать вторичный поток, чтобы основной поток не был занят слишком долго.

2 голосов
/ 26 августа 2010

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

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

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

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

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...