iphone上的对象分配工具

iphone上的对象分配工具,iphone,objective-c,memory-management,soap,memory-leaks,Iphone,Objective C,Memory Management,Soap,Memory Leaks,我在iphone中处理内存管理的方式有问题..请帮帮我..我没有主意了..我尝试使用下面的方法,但当我尝试为对象分配字符串(例如为sid分配)时,它开始泄漏,first_name等。我不知道怎么做。这是我从服务中获取所有联系人并将其插入数据库的方法。它会消耗更多内存,这是我通过在iphone上运行分配工具发现的,我在iphone上的应用程序会崩溃。请帮助我。有什么更好的解决方案。我想我的应用程序会崩溃消耗更多内存,但不确定在哪里查找。如果不清楚,我可以发布任何代码。非常感谢 - (void) g

我在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个联系人后崩溃,联系人从未显示在表视图上..可能是什么问题..我确保保存联系人的位置数据库是无泄漏的在下面的截图中我到底应该寻找什么…是总分配还是生活…请让我知道伙计们…我已经筋疲力尽了…非常感谢你的时间。。

您应该放置[字符串释放];result.entry\u list循环中forNSString*myStr内的行。每次调用alloc时,都必须有相应的释放调用

更好的方法是使用[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。您可能希望将工作分成更小的批,或者使用辅助线程,这样主线程就不会长时间处于繁忙状态。

您应该将[string release]放入;result.entry\u list循环中forNSString*myStr内的行。每次调用alloc时,都必须有相应的释放调用

更好的方法是使用[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。您可能希望将工作分成更小的批或使用辅助线程,以便主线程不会长时间处于繁忙状态。

这是一个很长的代码,可能是我错了。但我猜是这样的

for(NSString * myStr in result.entry_list) { // lots of alloc } // releases in this point 现在,如果在result.entry\u列表中有多个条目,我猜您有,那么您是不是泄漏了字符串?假设您在第一次分配中分配了str,在下一次分配中的第二次分配中,您正在泄漏此信息。明白我的意思了吗

如果这是问题所在,那么应该将释放调用移动到循环中

另一个解决方案是,似乎不需要此范围之外的字符串。那么为什么不使用自动恢复方法来创建它呢

str = [NSString stringWithFormat:@"what_you_need"];
你现在不需要释放它们。虽然在这种情况下,您应该考虑创建自己的自动存储池,因为数据量可能很大。p> 这是一个很长的代码,可能是我错了。但我猜是这样的

for(NSString * myStr in result.entry_list) { // lots of alloc } // releases in this point 现在,如果在result.entry\u列表中有多个条目,我猜您有,那么您是不是泄漏了字符串?假设您在第一次分配中分配了str,在下一次分配中的第二次分配中,您正在泄漏此信息。明白我的意思了吗

如果这是问题所在,那么应该将释放调用移动到循环中

另一个解决方案是,似乎不需要此范围之外的字符串。那么为什么不使用自动恢复方法来创建它呢

str = [NSString stringWithFormat:@"what_you_need"];
你现在不需要释放它们。虽然在这种情况下,您应该考虑创建自己的自动存储池,因为数据量可能很大。p> 您确实不应该在检查其他答案后编辑您的答案。或者至少指定您已从其他答案复制。这是一种懦弱的行为。@taskinoor:你真的认为
使用便利构造函数是你的一个原创概念,以至于你否决了那些不信任你的答案?因为你担心他们可能会从你的答案中夺走选票而否决好的答案,这比在你的答案中加入好的想法更懦弱。我不会投你反对票,因为你的答案也是正确的,但请尽量不要对其他用户如此咄咄逼人。问题的关键是帮助用户解决问题,而不是击败其他用户。当我尝试通过xcode运行应用程序时,它会在日志上输出以下消息:程序接收信号:“0”。数据格式化程序暂时不可用,将在“继续”后重试。加载共享库/Developer/usr/lib/libXcodeDebuggerSupport时出现未知错误。dylib@chuck,我不想打败其他人。对我来说,如果我在看到别人的反应后编辑我的答案,却不承认这一点,那似乎是对别人的侮辱和不尊重。就我个人而言,我永远不会那样做。为什么我要在我的答案中添加其他人已经说过的内容?它会帮助人们更多吗?与其在我的答案中添加内容,我想如果我只是写一个便条,看看其他答案或类似的东西,那会更礼貌。我想你明白我的意思了。@taskino或者很抱歉,我没有从文档以外的任何地方复制。当我编辑我的答案时,stackoverflow显示它是我发布后唯一没有刷新页面的答案。我很高兴我们的答案是一致的。我对你的答案投了赞成票,因为它更详细,并且提到了专用自动释放池的使用。好点子!我希望你不再觉得这是侮辱或不尊重。对不起,我不想讨论这个问题,我只是觉得有必要澄清一下。你真的不应该在检查了其他答案后再编辑你的答案。或者至少指定您已从其他答案复制。这是一种怯懦的行为。@taskinoor:你真的认为使用便利构造函数的想法是你的原创想法,以至于你否决了那些不信任你的答案?因为你担心他们可能会从你的答案中夺走选票而否决好的答案,这比在你的答案中加入好的想法更懦弱。我不会投你反对票,因为你的答案也是正确的,但请尽量不要对其他用户如此咄咄逼人。问题的关键是帮助用户解决问题,而不是击败其他用户。当我尝试通过xcode运行应用程序时,它会在日志上输出以下消息:程序接收信号:“0”。数据格式化程序暂时不可用,将在“继续”后重试。加载共享库/Developer/usr/lib/libXcodeDebuggerSupport时出现未知错误。dylib@chuck,我不想打败其他人。对我来说,如果我在看到别人的反应后编辑我的答案,却不承认这一点,那似乎是对别人的侮辱和不尊重。就我个人而言,我永远不会那样做。为什么我要在我的答案中添加其他人已经说过的内容?它会帮助人们更多吗?与其在我的答案中添加内容,我想如果我只是写一个便条,看看其他答案或类似的东西,那会更礼貌。我想你明白我的意思了。@taskino或者很抱歉,我没有从文档以外的任何地方复制。当我编辑我的答案时,stackoverflow显示它是我发布后唯一没有刷新页面的答案。我很高兴我们的答案是一致的。我对你的答案投了赞成票,因为它更详细,并且提到了专用自动释放池的使用。好点子!我希望你不再觉得这是侮辱或不尊重。对不起,我离题了,我只是觉得有必要澄清一下。