Objective c 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

我正在尝试编写一个例程,将数百条客户记录从以制表符分隔的文件导入到NSArrayController中

这是我的初始代码:

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];
        }
    }
}