在创建具有可变数组的字典时,我遇到了解内存管理的问题。我正在使用部署目标5.1的ios6 SDK。
在“Group”类的实现中,方法“namesAndEmails”构建一个数组“emailils”,其中包含带有电子邮件的Person对象的电子邮件地址。如果Person对象没有电子邮件,则将Person名称添加到另一个数组“namesWithNoEmail”。数组以字典形式返回。
#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];
}
代码中的其他地方我希望向一群人发送电子邮件,因此我调用了emailGroup方法,该方法通过在组中调用“namesAndEmails”来获取字典。
-(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];
}
据我所知,“namesAndEmails”中的[NSDictionary dictionaryWithObjects:objects forKeys:keys]返回一个自动释放的字典。但是,如果我发布“email”和“namesWithNoEmail”数组,为什么我的代码会崩溃?我认为字典在添加后会拥有数组的所有权,因此在方法中释放数组是安全的。我想这不正确,但为什么呢?
这样做是否更干净?谢谢你的任何建议!
答案 0 :(得分:2)
我的第一个建议是使用“Product-> Analyze”功能。如果你在某个地方泄漏或过度释放,它可能会给你确切的事件链。
其次,我看不到您的方法nameAndEmails
和emailGroup:
之间的关联。因为我看不到连接,所以我无法告诉你自动释放是否导致问题。
当主运行循环循环时,自动释放的对象被释放。所以你的NSDictionary
很有可能被释放。您可以通过执行任何操作来测试这一点,从将内存位置设置为调试器中的“监视”,以及每次循环运行循环时将控件行中的内容打印出来(我在主循环中做出了假设,所以纠正我如果那不是真的那样。)
您可以采取的其他措施来跟踪问题,即在乐器中使用“Zombies”或在配置中使用NSZombieEnable=YES