Ios Xcode正在“跳过”目标C代码的部分,没有错误
我遇到了一个问题,Xcode 5.1.1跳过了我代码的一部分。我已经加入了NSLog调试标记,我可以看到它运行在调试a中,而不是调试b中,而是运行调试c和后续程序。我没有收到任何错误,应用程序在模拟器中运行良好,除了没有跳过的代码。我不确定这里出了什么问题,因为没有错误或问题本身,所以我很难找到答案。我发现的一点似乎不适用于我的问题 第一部分加载mainBundle目录中的前4.jpg,然后转换和缩放它们以供UIImage使用。这部分很好用。我使用相同的代码从同一个mainBundle目录加载前10个.png图标。这就是被跳过的内容。我已经包括了前面的工作代码和下面跳过的代码Ios Xcode正在“跳过”目标C代码的部分,没有错误,ios,objective-c,for-loop,Ios,Objective C,For Loop,我遇到了一个问题,Xcode 5.1.1跳过了我代码的一部分。我已经加入了NSLog调试标记,我可以看到它运行在调试a中,而不是调试b中,而是运行调试c和后续程序。我没有收到任何错误,应用程序在模拟器中运行良好,除了没有跳过的代码。我不确定这里出了什么问题,因为没有错误或问题本身,所以我很难找到答案。我发现的一点似乎不适用于我的问题 第一部分加载mainBundle目录中的前4.jpg,然后转换和缩放它们以供UIImage使用。这部分很好用。我使用相同的代码从同一个mainBundle目录加载前
NSURL *bundleURL = [[NSBundle mainBundle] bundleURL];
NSString *imageFileName;
int i=0;
_profileImages = [NSMutableArray arrayWithObjects: @"", @"", @"", @"", nil];
for (NSURL *fileURL in enumerator) {
[fileURL getResourceValue:&imageFileName forKey:NSURLNameKey error:nil];
NSNumber *isDirectory;
[fileURL getResourceValue:&isDirectory forKey:NSURLIsDirectoryKey error:nil];
if (i<4){
if ([imageFileName hasSuffix:@"en.jpg"]){
NSURL *fqImageFileName = [NSURL URLWithString:imageFileName relativeToURL:bundleURL];
[_profileImages replaceObjectAtIndex:i withObject:fqImageFileName];
i++;
}
}
}
//convert image file name into image binary and scale
for (int j=0; j< _profileImages.count; j++){
NSData *imageData = [NSData dataWithContentsOfURL:_profileImages[j]];
UIImage *myimageRaw = [UIImage imageWithData:imageData];
CGSize imageSize = myimageRaw.size;
float imageHeight = imageSize.height;
UIImage *myimage = [UIImage imageWithData:imageData scale:imageHeight/284];
[_profileImages replaceObjectAtIndex:j withObject:myimage];
}
NSString *iconFileName;
int k=0;
_profileIcons = [NSMutableArray arrayWithObjects: @"", @"", @"", @"", @"", @"", @"", @"", @"", @"", nil];
NSLog(@"Debug a"); //last location code executes
for (NSURL *fileURL in enumerator) {
NSLog(@"Debug b"); //not executing
[fileURL getResourceValue:&iconFileName forKey:NSURLNameKey error:nil];
NSNumber *isDirectory;
[fileURL getResourceValue:&isDirectory forKey:NSURLIsDirectoryKey error:nil];
if (k<10){
if ([iconFileName hasSuffix:@"-128.png"]){
NSURL *fqIconFileName = [NSURL URLWithString:iconFileName relativeToURL:bundleURL];
[_profileIcons replaceObjectAtIndex:k withObject:fqIconFileName];
k++;
}
}
}
NSLog(@"Debug c"); //resumes execution
当我用完全相同的声明将NSDirectoryEnumerator的另一个实例声明为enumerator2时,它起了作用。我想我应该能够使用相同的实例,因为我在同一个目录中查找这两组文件。那么为什么我不能对这两个都使用相同的实例呢?有没有比每次需要迭代同一目录中的实例时创建新实例更好的方法呢?根据您的编辑,问题很简单-枚举器只能枚举一次 NSDirectoryEnumerator的基类NSEnumerator的文档: 将nextObject反复发送到新创建的NSEnumerator对象,使其返回原始集合中的下一个对象。当集合用尽时,返回nil。枚举数耗尽其集合后,不能“重置”枚举数。要再次枚举集合,需要新的枚举器 正如您所做的那样,创建第二个枚举器是正确的解决方案 那么为什么我不能对这两个都使用相同的实例呢 因为枚举器固有地包含状态,所以枚举器的关键在于它能够记住您在被枚举的集合中所处的位置。一旦到达末尾,枚举器就完成了。要再次枚举集合,需要一个新的枚举器 除此之外,看起来您正在将枚举数与快速枚举混合。我不确定这是否有效,但无论哪种方式,您都可以通过对集合使用快速枚举来更接近所需内容并简化代码。获取目录的内容,而不是从文件管理器获取枚举数:
NSArray *contents = contentsOfDirectoryAtURL:bundleURL
includingPropertiesForKeys:@[NSURLNameKey, NSURLIsDirectoryKey]
options:NSDirectoryEnumerationSkipsHiddenFiles
error:&error
由于内容是一个数组,而不是枚举数,因此可以在循环中重复使用它:
for (NSURL *fileURL in contents) {
//...
}
//...
for (NSURL *fileURL in contents) {
//...
}
什么是枚举器?它在哪里设置?如果为nil或空,for循环将不会运行。顺便说一句,这与Xcode无关。Xcode仅仅是您喜欢的编辑器。它不参与代码的运行。枚举器必须是非空数组,调试b才能运行。如果是,它将运行,如果不是,它将不会运行。NSLog枚举器并查找。在调试器中逐步执行代码以查看值和控制流。在调试NSLog@%d时打印日志,[枚举器计数]
for (NSURL *fileURL in contents) {
//...
}
//...
for (NSURL *fileURL in contents) {
//...
}