Objective c 方法创建一个包含11个对象的数组,所有对象都超出范围,无法识别选择器结果

Objective c 方法创建一个包含11个对象的数组,所有对象都超出范围,无法识别选择器结果,objective-c,unrecognized-selector,Objective C,Unrecognized Selector,好的,我正在做一个简单的查找。我有一个NSString对象数组和一个要在数组元素中搜索的字符串 在我尝试将匹配添加到一个新的可变数组(用于保存搜索结果)之前,一切似乎都正常。stringHolder变量获取字符串,ResultCollectorArray甚至获得正确数量的新元素,但每个元素都是空的并且“超出范围”。方法如下: @implementation NSArray (checkForString) -(NSMutableArray *) checkForString: (NSStrin

好的,我正在做一个简单的查找。我有一个NSString对象数组和一个要在数组元素中搜索的字符串

在我尝试将匹配添加到一个新的可变数组(用于保存搜索结果)之前,一切似乎都正常。stringHolder变量获取字符串,ResultCollectorArray甚至获得正确数量的新元素,但每个元素都是空的并且“超出范围”。方法如下:

@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];

}
@实现NSArray(checkForString)
-(NSMutableArray*)检查字符串:(NSString*)匹配
{
长无符号数组元素数;
长无符号循环=0;
NSRange搜索结果;
NSMutableArray*resultCollectorArray=[[NSMutableSet alloc]init];
身份证持有人;
numberofArrayElements=[自计数];
while(循环<数组元素数){
searchResults.length=0;
searchResults=[[self-objectAtIndex:loop]rangeOfString:matchsequested选项:NSCaseInsensitiveSearch];
如果(searchResults.length>0){
stringHolder=[self-objectAtIndex:loop];
[结果收集器数组addObject:stringHolder];
}
loop++;
}
返回[resultCollectorArray自动释放];
}
一旦我们回到程序的主要部分,我会收到一个无法识别的选择器,它被发送到应该接收方法结果的可变数组。以下是主要部分:

#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;
}
#导入
#导入“LookupInArray.h”
int main(int argc,const char*argv[]
{
NSAutoreleasePool*池=[[NSAutoreleasePool alloc]init];
NSString*testString=[[NSString alloc]initWithString:@“ab”];
NSMutableString*resultString=[[NSString alloc]init];
NSArray*theArray=[[NSArray alloc]initWithObjects:…,nil];//实际代码包含这些对象
NSMutableArray*resultArray=[[NSMutableArray alloc]init];
NSU整数数组计数=0;
无符号长循环=0;
resultArray=[theArray checkForString:testString];
arrayCount=[resultArray count];
while(循环<数组计数){
resultString=[resultaray objectAtIndex:loops];//这里是获取无法识别的选择器的地方。
NSLog(@“%@”,结果字符串);
循环++;
}
[pool drain];//另外,我稍后会释放这些对象。我只想先让上面的工作正常。
返回0;
}
我已经搜索了其他答案(几个小时了),但没有看到任何解决问题的方法

我们将非常感谢您的任何帮助


先谢谢你

NSMutableArray*resultCollectorArray=[[NSMutableSet alloc]init]太不正确了。您正在创建可变集并将其分配给可变数组

由于
objectAtIndex:
不是
NSMutableSet
的有效选择器,因此无法识别选择器。那么说,

NSMutableArray * resultCollectorArray = [[NSMutableArray alloc] init];
更好的方法

NSArray * filteredArray = [array filteredArrayUsingPredicate:[NSPredicate predicateWithFormat:@"SELF contains[cd] %@", searchString]];

可以使用谓词直接筛选数组。这样,您只需一步即可完成此操作。:)

迪帕克,谢谢!我在想这一定是件复杂的事情,它就在上面。另外,感谢您提供有关NSPredicate的更多信息。我(你可能已经猜到)对这件事还不熟悉。@bbum。抢手货第二个教训是更加小心。@ CTARGART,您可能还需要考虑重复数组。我刚刚在Stephen Kochan的“Objective-C编程”中读到了有关快速枚举的内容。(是的,我对这一点很陌生。不管是好是坏,同时学习C++和Objto-C)我会尝试改变我所做的事情来把它结合起来。再次感谢。请注意,不仅仅是
resultString
上的类型错误;创建局部变量时的第一次分配既是不必要的,也是泄漏。
resultArray
也是如此。