Iphone 词典功能问题
因此,我正在尝试动态地将数组保存到NSDictionary中。让我向您展示代码并解释发生了什么Iphone 词典功能问题,iphone,objective-c,ipad,ios4,Iphone,Objective C,Ipad,Ios4,因此,我正在尝试动态地将数组保存到NSDictionary中。让我向您展示代码并解释发生了什么 for (int x= 0; x <[appDelegate.people count]; x++) { Person *aPerson = [[Person alloc] init]; aPerson = [appDelegate.people objectAtIndex:x]; if ([appDelegate.groupedBusiness objectForKey
for (int x= 0; x <[appDelegate.people count]; x++) {
Person *aPerson = [[Person alloc] init];
aPerson = [appDelegate.people objectAtIndex:x];
if ([appDelegate.groupedBusiness objectForKey:aPerson.business_name] == nil) {
NSMutableArray *newBusiness = [[NSMutableArray alloc] init];
//if the business does not exist in the dict, add the person to the business and add it to dict.
[newBusiness addObject:aPerson];
[appDelegate.groupedBusiness setObject:newBusiness forKey:aPerson.business_name];
[newBusiness release];
newBusiness = nil;
//NSLog(@"%@", appDelegate.groupedBusiness);
} else {
NSMutableArray *existingBusiness= [appDelegate.groupedBusiness objectForKey:aPerson.business_name];
[existingBusiness addObject:aPerson];
//THIS IS THE LINE I AM NOT SURE ABOUT!!!
[appDelegate.groupedBusiness setObject:existingBusiness forKey:aPerson.business_name];
[existingBusiness release];
existingBusiness = nil;
//NSLog(@"%@", appDelegate.groupedBusiness);
}
}
for(int x=0;x为什么要释放existingBusiness?你不是在创建一个对象,只是从数组中获取指针。当你调用release时,retainCount变为0,对象解除分配
只需删除以下两行:
[existingBusiness release];
existingBusiness = nil;
一切正常。为什么要释放existingBusiness?你不是在创建对象,只是从数组中获取指针。当你调用release时,retainCount变为0,对象解除分配
[appDelegate.groupedBusiness setObject:existingBusiness forKey:aPerson.business_name];
[existingBusiness release];
existingBusiness = nil;
只需删除以下两行:
[existingBusiness release];
existingBusiness = nil;
一切都会好起来的
[appDelegate.groupedBusiness setObject:existingBusiness forKey:aPerson.business_name];
[existingBusiness release];
existingBusiness = nil;
这一切都应该被删除。existingBusiness已经存在于dict中,它是一个可变对象-当你向其中添加一个人时,它将反映在字典中,并且它是你正在处理的同一个对象。除此之外,正如Daniel指出的,你还有一些内存泄漏
这一切都应该被删除。现有业务已经存在于dict中,并且它是一个可变对象-当你向其中添加一个人时,它将反映在字典中,并且它是你正在处理的同一个对象。除此之外,正如Daniel指出的,你还存在一些内存泄漏。你是在过度复杂化这一点,而不是为了我漏了几件东西
for (Person *aPerson in appDelegate.people) {
NSMutableArray *business = [appDelegate.groupedBusiness objectForKey:aPerson.business_name];
if (!business) {
business = [NSMutableArray array];
[appDelegate.groupedBusiness setObject:business forKey:aPerson.business_name];
}
[business addObject:aPerson];
}
你把事情搞得太复杂了,更不用说泄露一些东西了
for (Person *aPerson in appDelegate.people) {
NSMutableArray *business = [appDelegate.groupedBusiness objectForKey:aPerson.business_name];
if (!business) {
business = [NSMutableArray array];
[appDelegate.groupedBusiness setObject:business forKey:aPerson.business_name];
}
[business addObject:aPerson];
}
不是答案,而是一些编码风格问题
如果不需要索引,请使用快速迭代:
for (Person *aPerson in appDelegate.people) {
使用方便的构造函数;它使代码更具可读性(请记住在末尾删除“release”):
尽可能避免重复逻辑:
NSMutableArray * business = [appDelegate.groupedBusiness objectForKey:aPerson.business_name;
if (!business) {
business = [NSMutableArray array];
}
[business addObject:aPerson];
[appDelegate.groupedBusiness setObject:business forKey:aPerson.business_name];
“setObject:existingBusiness”调用除了浪费CPU周期外没有任何改变,但在上述情况下,它使代码更具可读性。不是答案,而是一些编码风格问题
如果不需要索引,请使用快速迭代:
for (Person *aPerson in appDelegate.people) {
使用方便的构造函数;它使代码更具可读性(请记住在末尾删除“release”):
尽可能避免重复逻辑:
NSMutableArray * business = [appDelegate.groupedBusiness objectForKey:aPerson.business_name;
if (!business) {
business = [NSMutableArray array];
}
[business addObject:aPerson];
[appDelegate.groupedBusiness setObject:business forKey:aPerson.business_name];
“setObject:existingBusiness”调用除了浪费CPU周期外没有任何改变,但在上述情况下,它使代码更具可读性。与您的问题无关,但Person*aPerson=[[Person alloc]init];aPerson=[appDelegate.people objectAtIndex:x];will leak,您正在分配一个Person对象并将其分配给aPerson,然后将该变量点分配给其他对象,现在您分配了一个Person对象,该对象未被引用,保留计数为1个Hanks,注意到,我将对此进行修复。最初不是这样,但我出于某种原因更改了它。我不记得为什么。与您的问题无关,而是Person*aPerson=[[Person alloc]init];aPerson=[appDelegate.people objectAtIndex:x];will leak,您正在分配一个Person对象并将其分配给aPerson,然后将该变量点分配给其他对象,现在您分配了一个Person对象,该对象未被引用,保留计数为1个Hanks,注意到,我将对此进行修复。最初不是这样,但我出于某种原因更改了它。我不记得为什么。因此,对象不会在循环的每次迭代中都被重新创建?如果个人的商业名称不存在于dict中,我想创建一个新的键值对。因此,对象不会在循环的每次迭代中被重新创建?如果个人的商业名称不存在于dict中,我想创建一个新的键值对。我不认为这是我想要的但我想这样做。我想在dict中不存在该人员的业务名称时创建一个新的键值对。这样做的想法是,我只需检查一下,然后将相同业务名称的人员添加到该数组中,而不是创建新的。我只会在dict中不存在该业务名称时创建一个新数组。@gabaum10:这正是我在第四行所做的。啊,好吧,我想我只是误解了。不管怎样,我都修复了它。谢谢你的帮助!我不认为这是我想做的。我想在口述中不存在此人的企业名称时创建一个新的键值对。我的想法是,然后我只需对照它进行检查并添加同一个企业的人将名称添加到该数组中,而不是创建新的数组。我只会在该企业名称在字典中不存在时创建一个新数组。@gabaum10:这正是我在第四行所做的。啊,好吧,我想我只是误解了。不管怎样,我都修复了它。谢谢你的帮助!就是这样!谢谢,我真的很挣扎使用此系统中的内存管理。何时释放?何时不释放?释放已发送[alloc]、[copy]或[retain]的对象到。没有其他。就是这样!谢谢,我真的很难在这个系统中管理内存。你什么时候释放,什么时候不释放?你释放一个你已经发送[alloc]、[copy]或[retain]的对象到。没有其他的。啊,现在有意义了。所以当你使用可变数组时,你不必在循环的每次迭代中都重新声明它,如果它是在那里初始化的?我现在明白了。我将阅读更多关于内存管理的内容。这才是真正让我陷入循环的原因。我不确定你的意思是什么“如果在循环的每个迭代中都初始化了它,则不必重新声明它”。[NSMutableArray]相当于[[NSMutableArray alloc]init]autorelease].啊,这现在是有意义的。所以当你使用可变数组时,你不必在循环的每个迭代中都重新声明它,如果它是在那里初始化的?我现在明白了。我将阅读更多关于内存管理的内容。这才是真正让我陷入循环的原因。我不确定你所说的“您不必在循环的每次迭代中都重新声明它(如果它是在循环的每个迭代中初始化的)。“[NSMutableArray]相当于[[[NS]