创建带有可变数组的字典时,我遇到了一些问题,例如理解内存管理。我正在使用部署目标5.1的ios6 SDK。使用NSMutableArrays创建NSDictionary的内存管理
在类“Group”的实现中,“namesAndEmails”方法使用电子邮件构建一个数组“emails”,其中包含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];
}
据我明白[NSDictionary的dictionaryWithObjects:对象forKeys:键]在 “namesAndEmails” 返回一个自动释放的字典。但是,如果我释放“emails”和“namesWithNoEmail”数组,为什么我的代码会崩溃?我认为字典在添加后会拥有数组的所有权,因此在方法中释放数组将是安全的。我想这不正确,但为什么?
这是干净的吗?感谢您的任何建议!
我不想成为那个人,但随着iOS6的和部署5.1,为什么你会不使用弧? –
你可以发布有关崩溃的更多细节吗?你的内存管理看起来很好。另外,你应该使用'[email length]'来获得NSString的长度(什么是'len()'?)。 –
@Andrew当我尝试访问字典中的数组时,我得到一个线程1 EXC_BAD_ACCESS。但是,只有当我使用上面代码中注释掉的两条发布行时。 len()是python--对不起:-) – JacobS