2012-05-25 40 views
0

我有以下代码NSCountedSet是如何工作的?

NSCountedSet *set = [[NSCountedSet alloc] init]; 
NSMutableString *lDesktopPath = [[NSMutableString alloc] initWithString:@"/Users/new/Desktop/"]; 
int i= 10; 
while (i) 
{ 

    NSLog(@"%@", [NSString stringWithFormat:@"%@%d",[lDesktopPath stringByDeletingLastPathComponent],i]); 
    [lDesktopPath setString:[NSString stringWithFormat:@"%@%d",[lDesktopPath stringByDeletingLastPathComponent],i ]]; 
    NSLog(@"%p", lDesktopPath); 
    [set addObject:lDesktopPath]; 
    NSLog(@"%@", set); 
    --i; 
} 
NSLog(@"%@", set); 

输出:

2012-05-25 20:41:37.619 NSCountableset[21955:a0f] /Users/new10 
2012-05-25 20:41:37.621 NSCountableset[21955:a0f] 0x100111ac0 
2012-05-25 20:41:37.623 NSCountableset[21955:a0f] <NSCountedSet: 0x1001114b0> (/Users/new10 [1]) 
2012-05-25 20:41:37.623 NSCountableset[21955:a0f] /Users9 
2012-05-25 20:41:37.624 NSCountableset[21955:a0f] 0x100111ac0 
2012-05-25 20:41:37.624 NSCountableset[21955:a0f] <NSCountedSet: 0x1001114b0> (/Users9 [1], /Users9 [1]) 
2012-05-25 20:41:37.625 NSCountableset[21955:a0f] /8 
2012-05-25 20:41:37.625 NSCountableset[21955:a0f] 0x100111ac0 
2012-05-25 20:41:37.625 NSCountableset[21955:a0f] <NSCountedSet: 0x1001114b0> (/8 [1], /8 [1], /8 [1]) 
2012-05-25 20:41:37.626 NSCountableset[21955:a0f] /7 
2012-05-25 20:41:37.626 NSCountableset[21955:a0f] 0x100111ac0 
2012-05-25 20:41:37.627 NSCountableset[21955:a0f] <NSCountedSet: 0x1001114b0> (/7 [1], /7 [1], /7 [2]) 
2012-05-25 20:41:37.627 NSCountableset[21955:a0f] /6 
2012-05-25 20:41:37.628 NSCountableset[21955:a0f] 0x100111ac0 
2012-05-25 20:41:37.628 NSCountableset[21955:a0f] <NSCountedSet: 0x1001114b0> (/6 [2], /6 [1], /6 [2]) 
2012-05-25 20:41:37.635 NSCountableset[21955:a0f] /5 
2012-05-25 20:41:37.635 NSCountableset[21955:a0f] 0x100111ac0 
2012-05-25 20:41:37.636 NSCountableset[21955:a0f] <NSCountedSet: 0x1001114b0> (/5 [2], /5 [2], /5 [2]) 
2012-05-25 20:41:37.636 NSCountableset[21955:a0f] /4 
2012-05-25 20:41:37.640 NSCountableset[21955:a0f] 0x100111ac0 
2012-05-25 20:41:37.640 NSCountableset[21955:a0f] <NSCountedSet: 0x1001114b0> (/4 [2], /4 [2], /4 [3]) 
2012-05-25 20:41:37.641 NSCountableset[21955:a0f] /3 
2012-05-25 20:41:37.641 NSCountableset[21955:a0f] 0x100111ac0 
2012-05-25 20:41:37.642 NSCountableset[21955:a0f] <NSCountedSet: 0x1001114b0> (/3 [3], /3 [2], /3 [3]) 
2012-05-25 20:41:37.642 NSCountableset[21955:a0f] /2 
2012-05-25 20:41:37.643 NSCountableset[21955:a0f] 0x100111ac0 
2012-05-25 20:41:37.643 NSCountableset[21955:a0f] <NSCountedSet: 0x1001114b0> (/2 [3], /2 [3], /2 [3]) 
2012-05-25 20:41:37.643 NSCountableset[21955:a0f] /1 
2012-05-25 20:41:37.644 NSCountableset[21955:a0f] 0x100111ac0 
2012-05-25 20:41:37.644 NSCountableset[21955:a0f] <NSCountedSet: 0x1001114b0> (/1 [3], /1 [3], /1 [4]) 
2012-05-25 20:41:37.644 NSCountableset[21955:a0f] <NSCountedSet: 0x1001114b0> (/1 [3], /1 [3], /1 [4]) 

我期待着在最后一盘,但决胜盘10个不同的值只包含3周相同的价值观,为什么呢?

回答

4

嗯,我认为你的设置是完全拧紧的。正如你可以从指针NSLog看到的,你实际上每次都添加相同的可变字符串。但是你也在改变它,而它在集合中。这一定意味着字符串的散列值发生了变化,使用isEqual:的结果也是如此,就我所知,这意味着该集合可能不再能够找到已存在的对象。

为什么你在这里使用可变字符串,尤其是因为你已经创建了一个完全可接受的不可变字符串(每次迭代两次)?像这样更改您的代码:

NSCountedSet *set = [[NSCountedSet alloc] init]; 
NSString *lDesktopPath = @"/Users/new/Desktop/"; 
int i= 10; 
while (i) 
{ 
    lDeskTopPath = [NSString stringWithFormat:@"%@%d",[lDesktopPath stringByDeletingLastPathComponent], i]; 
    NSLog(@"%@", lDesktopPath); 
    NSLog(@"%p", lDesktopPath); 
    [set addObject:lDesktopPath]; 
    NSLog(@"%@", set); 
    --i; 
} 
NSLog(@"%@", set);