好的,我正在做一个简单的查找。我有一个NSString对象数组和一个在数组元素中搜索的字符串。
这一切似乎都有效,直到我尝试将一个匹配添加到一个新的可变数组,以保存搜索结果。 stringHolder变量获取字符串,resultsCollectorArray甚至获得正确数量的新元素,但每个元素都是空的并且“超出范围”。这是方法:
@implementation NSArray (checkForString)
-(NSMutableArray *) checkForString: (NSString *) matchSought
{
long unsigned numberofArrayElements;
long unsigned loop = 0;
NSRange searchResults;
NSMutableArray * resultCollectorArray = [[NSMutableSet alloc] init];
id stringHolder;
numberofArrayElements = [self count];
while (loop < numberofArrayElements) {
searchResults.length = 0;
searchResults = [[self objectAtIndex: loop] rangeOfString: matchSought options:NSCaseInsensitiveSearch];
if (searchResults.length > 0) {
stringHolder = [self objectAtIndex: loop];
[resultCollectorArray addObject: stringHolder];
}
loop++;
}
return [resultCollectorArray autorelease];
}
一旦我们回到程序的主要部分,我就会得到一个无法识别的选择器,该选择器被发送到应该接收该方法结果的可变数组。这是主要部分:
#import <Foundation/Foundation.h>
#import "LookupInArray.h"
int main (int argc, const char * argv[])
{
NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
NSString *testString = [[NSString alloc] initWithString: @"ab"];
NSMutableString * resultString = [[NSString alloc] init];
NSArray * theArray = [[NSArray alloc] initWithObjects: ..., nil]; // Actual code has the objects
NSMutableArray *resultArray = [[NSMutableArray alloc] init];
NSUInteger arrayCount = 0;
unsigned long loops = 0;
resultArray = [theArray checkForString: testString];
arrayCount = [resultArray count];
while (loops < arrayCount){
resultString = [resultArray objectAtIndex: loops]; // Here's where we get the unrecognized selector.
NSLog(@"%@", resultString);
loops++;
}
[pool drain]; // Also, I'll release the objects later. I just want to get what's above working first.
return 0;
}
我已经搜索了其他答案(现在几个小时),但没有看到任何解决问题的方法。
任何和所有的帮助将非常感激。
事先谢谢。
答案 0 :(得分:8)
NSMutableArray * resultCollectorArray = [[NSMutableSet alloc] init];
是如此不正确。您正在创建一个可变集并将其分配给可变数组。
由于objectAtIndex:
不是NSMutableSet
的有效选择器,因此您无法识别选择器。发表声明,
NSMutableArray * resultCollectorArray = [[NSMutableArray alloc] init];
更好的方式
NSArray * filteredArray = [array filteredArrayUsingPredicate:[NSPredicate predicateWithFormat:@"SELF contains[cd] %@", searchString]];
您可以使用谓词直接过滤数组。这样您只需一步即可完成此操作。 :)