【发布时间】:2011-03-16 00:27:04
【问题描述】:
我需要一些指导,了解如何在 10.6 下调试 Cocoa 中的并发问题。我正在将“for”循环转换为使用 NSOperations,但大多数时候,代码只是在循环中的某个点冻结。我可以在控制台中看到 NSLog 输出。在极少数情况下,代码会一直运行,这很好。
代码仅是模型层,从控制器中的方法启动。该方法仅遍历 8-10 个模型对象,指示它们每个将其输出写入一个唯一命名的文件。 8 个模型对象 = 8 个单独的文件。没有对 GUI 的调用,模型对象是 NSManagedObject 子类,其中包含一组子 NSManagedObject 对象(其中 0..n 个),每个拥有对象都会汇总并写出这些子类。输出格式为 JSON。
代码:
__block NSMutableArray *collectionOfCourses = [[NSMutableArray alloc] initWithCapacity:[[self courses] count]];
/* Create a filename. Use our title and set it to lowercase */
NSURL *ourFileURL = [aURL URLByAppendingPathComponent:[[self title] lowercaseString]];
ourFileURL = [ourFileURL URLByAppendingPathExtension:@"js"];
for (Course *aCourse in [self courses]) {
[[self opQueue] addOperationWithBlock:^{
NSArray *arrayForOneCourse = [aCourse arrayAndWriteToFileURL:aURL fileFormat:format];
[collectionOfCourses addObject:arrayForOneCourse];
}];
}
我做了很多 NSLogs,这会是问题吗?来自后台线程的 NSLog'ing 是一件坏事吗?
由于我是从块内部添加到可变数组中,所以我将可变数组声明为 __block 是否正确?我已经尝试了两种方法,似乎与这个冻结问题没有区别。
如何使用 Xcode v4 调试此问题?我想知道它冻结的代码行,或者两行代码同时执行并导致它阻止执行。我以前设置单个断点和单步执行代码的技术不再有效, 因为并发。
谢谢
【问题讨论】:
标签: cocoa debugging concurrency xcode4 nsoperationqueue