Objective c NSArrayController为什么这样做';不行?
我正在尝试编写一个例程,将数百条客户记录从以制表符分隔的文件导入到NSArrayController中 这是我的初始代码:Objective c NSArrayController为什么这样做';不行?,objective-c,cocoa,nsarraycontroller,Objective C,Cocoa,Nsarraycontroller,我正在尝试编写一个例程,将数百条客户记录从以制表符分隔的文件导入到NSArrayController中 这是我的初始代码: NSString *stringFromFile = [NSString stringWithContentsOfFile:[fileURL path] encoding:NSUTF8StringEncoding error:&error]; NSArray *paragraphsArray = [st
NSString *stringFromFile = [NSString stringWithContentsOfFile:[fileURL path]
encoding:NSUTF8StringEncoding error:&error];
NSArray *paragraphsArray = [stringFromFile componentsSeparatedByString:@"\r"];
NSMutableDictionary *destDict = [[NSMutableDictionary alloc] init];
int i;
for (i = 0; i <= [paragraphsArray count]-1; i++) {
NSString *currentParagraph = [paragraphsArray objectAtIndex:i];
if ([currentParagraph length ] > 4) {
NSArray *elementsArray = [currentParagraph componentsSeparatedByString:@"\t"];
if ([elementsArray count] > 0) {
currentSerial++;
[destDict setObject:[NSString stringWithFormat:@"%ld",currentSerial]
forKey:@"idSerial"];
[destDict setObject:[elementsArray objectAtIndex:1]
forKey:@"destRazaoSocial"];
[destDict setObject:[elementsArray objectAtIndex:2]
forKey:@"destLogradouro"];
[destDict setObject:[elementsArray objectAtIndex:3]
forKey:@"destLogradouroNro"];
/// repeat this for every field...
//Add the record:
[destArrayController addObject:destDict];
}
}
}
NSString*stringFromFile=[NSString stringWithContentsOfFile:[fileURL路径]
编码:NSUTF8StringEncoding错误:&错误];
NSArray*段落数组=[stringFromFile组件由字符串分隔:@“\r”];
NSMutableDictionary*destDict=[[NSMutableDictionary alloc]init];
int i;
对于(i=0;i 4){
NSArray*elementsArray=[当前段落组件由字符串分隔:@“\t”];
如果([elementsArray计数]>0){
currentSerial++;
[destDict setObject:[NSString stringWithFormat:@“%ld”,currentSerial]
forKey:@“idSerial”];
[destDict setObject:[elementsArray objectAtIndex:1]
福基:@“破坏性的”];
[destDict setObject:[elementsArray objectAtIndex:2]
福基:“destLogradouro”];
[destDict setObject:[elementsArray objectAtIndex:3]
forKey:“destLogradouroNro”];
///对每个字段重复此操作。。。
//添加记录:
[destArrayController addObject:destDict];
}
}
}
这段代码导致错误地插入记录,如果我在一个示例中有4条记录,则插入的4条记录的内容将与最后一条记录的内容相同
但是,如果我将代码更改为这样,允许destDict并在每个循环中破坏它,它就会起作用:
NSString *stringFromFile = [NSString stringWithContentsOfFile:[fileURL path]
encoding:NSUTF8StringEncoding error:&error];
NSArray *paragraphsArray = [stringFromFile componentsSeparatedByString:@"\r"];
int i;
for (i = 0; i <= [paragraphsArray count]-1; i++) {
NSString *currentParagraph = [paragraphsArray objectAtIndex:i];
if ([currentParagraph length ] > 4) {
NSArray *elementsArray = [currentParagraph componentsSeparatedByString:@"\t"];
if ([elementsArray count] > 0) {
NSMutableDictionary *destDict = [[NSMutableDictionary alloc] init];
currentSerial++;
[destDict setObject:[NSString stringWithFormat:@"%ld",currentSerial]
forKey:@"idSerial"];
[destDict setObject:[elementsArray objectAtIndex:1]
forKey:@"destRazaoSocial"];
[destDict setObject:[elementsArray objectAtIndex:2]
forKey:@"destLogradouro"];
[destDict setObject:[elementsArray objectAtIndex:3]
forKey:@"destLogradouroNro"];
/// repeat this for every field...
//Add the record:
[destArrayController addObject:destDict];
[destDict release];
}
}
}
NSString*stringFromFile=[NSString stringWithContentsOfFile:[fileURL路径]
编码:NSUTF8StringEncoding错误:&错误];
NSArray*段落数组=[stringFromFile组件由字符串分隔:@“\r”];
int i;
对于(i=0;i 4){
NSArray*elementsArray=[当前段落组件由字符串分隔:@“\t”];
如果([elementsArray计数]>0){
NSMutableDictionary*destDict=[[NSMutableDictionary alloc]init];
currentSerial++;
[destDict setObject:[NSString stringWithFormat:@“%ld”,currentSerial]
forKey:@“idSerial”];
[destDict setObject:[elementsArray objectAtIndex:1]
福基:@“破坏性的”];
[destDict setObject:[elementsArray objectAtIndex:2]
福基:“destLogradouro”];
[destDict setObject:[elementsArray objectAtIndex:3]
forKey:“destLogradouroNro”];
///对每个字段重复此操作。。。
//添加记录:
[destArrayController addObject:destDict];
[目的地释放];
}
}
}
这很管用,但在我看来并不优雅。
请告诉我正确的方法好吗?第二种方法没有错。另一种方法(可能更好,也可能不更好)是第一种方法,但将[destDict copy]而不是destDict添加到数组中 关于for循环的另一点是——如果不需要使用索引(代码中没有),那么应该使用快速枚举。它写起来更快更容易。那么这个,
int i;
for (i = 0; i <= [paragraphsArray count]-1; i++) {
NSString *currentParagraph = [paragraphsArray objectAtIndex:i];
第一个代码不起作用的原因是,您正在循环外部创建
NSMutableDictionary
,更改其内容,然后将其多次添加到数组中
将对象添加到数组中时,它不会创建对象的实际副本,相反,数组只会向该对象发送一条retain
消息。因此,在您的第一个代码段中,由于您在循环之外创建了destDict
实例,因此最终会将相同的destDict
实例多次添加到数组中。因为它是同一个实例,所以字典将有效地包含您在最后一个循环中所做更改的内容
您可以使用第二个示例中的代码,但不必使用alloc/init
创建destDict
,只需使用[NSMutableDictionary]
创建一个自动发布的实例即可。那么就不需要添加[destDict release]将其添加到阵列控制器后的代码>行。(没什么大不了的,但无论如何)
NSString*stringFromFile=[NSString stringWithContentsOfFile:[fileURL路径]
编码:NSUTF8StringEncoding错误:&错误];
NSArray*段落数组=[stringFromFile组件由字符串分隔:@“\r”];
int i;
对于(i=0;i 4){
NSArray*elementsArray=[当前段落组件由字符串分隔:@“\t”];
如果([elementsArray计数]>0){
NSMutableDictionary*destDict=[NSMutableDictionary];
currentSerial++;
[destDict setObject:[NSString stringWithFormat:@“%ld”,currentSerial]
forKey:@“idSerial”];
[destDict setObject:[elementsArray objectAtIndex:1]
福基:@“破坏性的”];
[destDict setObject:[elementsArray objectAtIndex:2]
福基:“destLogradouro”];
[destDict setObject:[elementsArray objectAtIndex:3]
forKey:“destLogradouroNro”];
///对每个字段重复此操作。。。
//添加记录:
[destArrayController addObject:destDict];
}
}
}
for (NSString *currentParagraph in paragraphArray){
....
....
}
NSString *stringFromFile = [NSString stringWithContentsOfFile:[fileURL path]
encoding:NSUTF8StringEncoding error:&error];
NSArray *paragraphsArray = [stringFromFile componentsSeparatedByString:@"\r"];
int i;
for (i = 0; i <= [paragraphsArray count]-1; i++) {
NSString *currentParagraph = [paragraphsArray objectAtIndex:i];
if ([currentParagraph length ] > 4) {
NSArray *elementsArray = [currentParagraph componentsSeparatedByString:@"\t"];
if ([elementsArray count] > 0) {
NSMutableDictionary *destDict = [NSMutableDictionary dictionary];
currentSerial++;
[destDict setObject:[NSString stringWithFormat:@"%ld",currentSerial]
forKey:@"idSerial"];
[destDict setObject:[elementsArray objectAtIndex:1]
forKey:@"destRazaoSocial"];
[destDict setObject:[elementsArray objectAtIndex:2]
forKey:@"destLogradouro"];
[destDict setObject:[elementsArray objectAtIndex:3]
forKey:@"destLogradouroNro"];
/// repeat this for every field...
//Add the record:
[destArrayController addObject:destDict];
}
}
}