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