【发布时间】:2011-10-07 17:38:47
【问题描述】:
我已经盯着这段代码看了一段时间,但不知道到底哪里出了问题。我有一个名为 SortFilteringController 的类,它管理我在系统中拥有的不同过滤(内部过滤器、公共过滤器、排序选项等)。这些中的每一个都存储在一个数组中。所以我有一个方便的方法,它基本上采用这些数组中的任何一个,并用一些新数据重置它们。
例如setInternalFilter,直接调用即可。
- (void) setInternalFilterTerms : (NSArray*) filterTerms {
[self resetArray: &_internalFilters withNewData:filterTerms];
}
resetArray 的定义,就是将已有的数据转储(释放),并将新数据复制过来。
- (void) resetArray: (NSMutableArray**) oldArray withNewData : (NSArray*) newData {
if (*oldArray != nil) {
[*oldArray release];
}
NSMutableArray* newArray = [[NSMutableArray alloc] initWithArray:newData copyItems:YES];
*oldArray = [newArray retain];
[newArray release];
}
但我的问题是我在重置方法中遇到了崩溃。不在模拟器中,仅在设备上。
Thread 0 Crashed:
0 libsystem_kernel.dylib 0x331a3a1c __pthread_kill + 8
1 libsystem_c.dylib 0x3404c3b4 pthread_kill + 52
2 libsystem_c.dylib 0x34044bf8 abort + 72
3 libstdc++.6.dylib 0x30e4fa64 __gnu_cxx::__verbose_terminate_handler() + 376
4 libobjc.A.dylib 0x30fda06c _objc_terminate + 104
5 libstdc++.6.dylib 0x30e4de36 __cxxabiv1::__terminate(void (*)()) + 46
6 libstdc++.6.dylib 0x30e4de8a std::terminate() + 10
7 libstdc++.6.dylib 0x30e4df5a __cxa_throw + 78
8 libobjc.A.dylib 0x30fd8c84 objc_exception_throw + 64
9 CoreFoundation 0x33e5f1b8 -[NSObject(NSObject) doesNotRecognizeSelector:] + 96
10 CoreFoundation 0x33e5e642 ___forwarding___ + 502
11 CoreFoundation 0x33dd5178 _CF_forwarding_prep_0 + 40
12 CoreFoundation 0x33dcb156 -[NSArray initWithArray:range:copyItems:] + 366
13 CoreFoundation 0x33dcafce -[NSArray initWithArray:copyItems:] + 54
14 Wine DB 1.1 0x001b6a2a -[SortFilterController resetArray:withNewData:] (SortFilterController.m:1310)
15 Wine DB 1.1 0x001b4188 -[SortFilterController setInternalFilterTerms:] (SortFilterController.m:733)
我正在运行带有 iOS 5.0 GM 种子的 xcode 4.2。我的设备仍在运行 4.1.3。但这不应该有所作为吧?错误是“doesNotRecognizeSelector”。多么奇怪。
谢谢。
【问题讨论】:
-
请输入错误的完整文本——我发现模拟器中存在接口但设备中没有接口的实例。它不识别哪个选择器?
标签: objective-c ios nsmutablearray nsarray deep-copy