NSString.length给出了EXC_BAD_ACCESS

时间:2011-10-23 00:12:51

标签: objective-c cocoa nsstring

我有以下代码:

NSArray *array = [[NSFileManager defaultManager] contentsOfDirectoryAtPath:path error:nil];

NSString *temp;
for (int i = 0; i < [array count]; i++)
{
    temp = [array objectAtIndex:i];
    NSLog(@"temp length = %@", [temp length]);
}

我在NSLog行遇到EXC_BAD_ACCESS错误。我认为它在[temp length]位错误。奇怪的是,我可以在temp上使用NSString的其他方法,它们工作得很好,比如[temp characterAtIndex:0]

我也尝试过[[array objectAtIndex:i] retain];,但这似乎没有帮助。

有谁知道我为什么会收到这个错误?


编辑:原来它在NSLog崩溃,因为它是%@而不是%lu。真正的问题是我从这篇文章中省略的其他代码。在玩了一些之后,我开始工作了。

2 个答案:

答案 0 :(得分:9)

根据我的理解,“%@”占位符用于对象指针,“length”返回“NSUInteger”,它不是指针。尝试“%lu”而不是“%@”。

答案 1 :(得分:2)

这个(略微清理过的)版本对我有用:

    NSError *error = nil;
    NSString *path = [@"~/Desktop" stringByExpandingTildeInPath];
    NSArray *array = [[NSFileManager defaultManager] contentsOfDirectoryAtPath:
        path error:&error];
    if (error) NSLog(@"%@", error);

    for (NSString *path in array) {
        NSLog(@"Path length = %lu", path.length);
    }

正如thg435所提到的,“%@”用于对象指针,因此如果你传递一个任意数字,它将引发内存访问错误。