内存管理使用NSMUTABLERARES创建NSDICTIONARY



当创建具有可变数组的字典时,我会理解内存管理的问题。我正在使用带有部署目标5.1的IOS6 SDK。

在实现类"组"方法"名称和邮件"中,"构建数组"电子邮件"包含电子邮件对象的电子邮件地址"中的阵列"电子邮件"。如果个人对象没有电子邮件,则将人员名称添加到另一个数组"名称WithNoEmail"中。阵列在字典中返回。

#import "Group.h"
@implementation Group 
-(NSDictionary*) namesAndEmails {
    NSMutableArray  *emails = [[NSMutableArray alloc] initWithCapacity:0] ;
    NSMutableArray  *namesWithNoEmail = [[NSMutableArray alloc] initWithCapacity:0];
    NSString *email;
    NSString *name;
    for (Person *p in allPersons) {
        email = p.email;
        name = p.name;
        if ([email length]==0) {
            [namesWithNoEmail addObject:name];
        } else {
            [emails addObject:email];
        }
    }
    NSArray *keys = [NSArray arrayWithObjects:@"emails",@"names", nil];
    NSArray *objects = [NSArray arrayWithObjects:emails, namesWithNoEmail, nil];
    //[emails release];
    //[namesWithNoEmail release];
     return [NSDictionary dictionaryWithObjects:objects forKeys:keys];
}

我希望在代码中的其他地方发送电子邮件给一组人,因此我将电子邮件组方法称为"词组"方法,该方法通过在组上调用" nameandemails"来获取字典。

-(void) emailGroup:(Group*) g {
    NSDictionary *emailInfo = [g namesAndEmails];
    guestsWithNoEmail = [emailInfo objectForKey:@"names"];
    guestEmails = [emailInfo objectForKey:@"emails"];
   int nGuestsWithNoEmail = [guestsWithNoEmail count];
   if (nGuestsWithNoEmail > 0) {
      UIAlertView *alert = [[[UIAlertView alloc] initWithTitle:@"No emails" message:@"" delegate:self cancelButtonTitle:@"OK" otherButtonTitles:nil] autorelease];
      [alert show];
   }
    // some more code here

    MFMailComposeViewController *picker = [[MFMailComposeViewController alloc] init];
    picker.mailComposeDelegate = self;
    [picker setSubject:subject];
    [picker setMessageBody:@"" isHTML:NO];
    [picker setToRecipients:guestEmails];
    [[self delegate ] presentModalViewController:picker animated:YES];
    [picker release];
}
据我了解,据我了解[NSDICTIONARY DICTIONARYWITHOBJJECTS:objects forkeys:keys]在"名称和邮件"中返回自读字典。但是,如果我发布"电子邮件"one_answers"名称Withnoemail"数组,为什么我的代码崩溃呢?我认为词典将在添加阵列后具有所有权,因此可以安全地释放该方法中的数组。我想那不是正确的,但是为什么?

这样做的更干净吗?谢谢您的任何建议!

我的第一个建议是使用"产品 ->分析"功能。如果您在某处泄漏或发布过度,它可能会给您确切的事件链。

其次,我看不到您的方法nameAndEmailsemailGroup:之间的链接。因为我看不到连接,所以我无法告诉您自动发行是否引起了问题。

当主运行循环周期时,自动释放的对象会释放。因此,您的NSDictionary很可能会发布。您可以通过将内存位置设置为调试器中的"手表"来进行测试如果那不是真的)。

您可以采取的其他事情来跟踪问题是在您的配置中使用"僵尸"或NSZombieEnable=YES中的"僵尸"

最新更新