Ios 如何测试NSMutableArray中是否存在NSCFConstantString?
好的,我有一个Popover,包含一个tableView,它由一个填充了字符串的Ios 如何测试NSMutableArray中是否存在NSCFConstantString?,ios,objective-c,uitableview,nsstring,uipopovercontroller,Ios,Objective C,Uitableview,Nsstring,Uipopovercontroller,好的,我有一个Popover,包含一个tableView,它由一个填充了字符串的NSMutableArray填充。但是在我的NSMutableArray中总是有一个空白/空的字符串,而在我的popover表中总是有一个空单元格。我单步执行了我的项目,发现空字符串是一个字符串常量(\u NSCFConstantString) 我尝试通过执行一个简单的空字符串测试来消除出现的空字符串: [str isEqualToString:@""] 但这不起作用,我假设是因为数组中的空字符串是_NSCFCo
NSMutableArray
填充。但是在我的NSMutableArray
中总是有一个空白/空的字符串,而在我的popover表中总是有一个空单元格。我单步执行了我的项目,发现空字符串是一个字符串常量(\u NSCFConstantString)
我尝试通过执行一个简单的空字符串测试来消除出现的空字符串:
[str isEqualToString:@""]
但这不起作用,我假设是因为数组中的空字符串是_NSCFConstantString
所以我想知道的是,是否有一种方法可以测试一个对象的类型是\NSCFConstantString
,或者你们是否有更好的方法来测试一个字符串是否为空
以下是与我的问题相关的完整代码:
NSString *str;
for (int i = 0; i < [self.flattenedDocList count]; i++) {
str = [self.flattenedDocList objectAtIndex:i];
if(![str isKindOfClass:[NSString class]]){
[self.flattenedDocList removeObject: str];
NSLog(@"Just Deleted:%@",str);
}else if([str isEqualToString:@""]){
[self.flattenedDocList removeObject: str];
NSLog(@"Just Deleted:%@",str);
}
}
NSString*str;
对于(int i=0;i<[self.flattedDocList计数];i++){
str=[self.flattedDocList对象索引:i];
if(![str iskindof类:[NSString类]]){
[self.flattedDocList-removeObject:str];
NSLog(@“刚删除:%@”,str);
}else if([str IsequalString:@”“){
[self.flattedDocList-removeObject:str];
NSLog(@“刚删除:%@”,str);
}
}
第一个if语句是一个清除数组中任何NSNull
对象的检查。不幸的是,这并没有消除字符串常量:/
谢谢,非常感谢您的帮助
但是这不起作用,我假设是因为我数组中的空字符串的类型是\NSCFConstantString
不完全是\u NSCFConstantString
是NSString
的一个具体子类,因此它应该可以工作
可能字符串不是真正的空字符串,或者它不在数组中。检查是否是一个空间(或多个空间),出于偶然。检查其length
属性等
顺便说一句,在枚举可变集合时修改它是一个非常糟糕的主意,它可能会导致逻辑错误。也许这也是您当前问题的一部分。好吧,所以我犯了一个新手错误,在枚举时修改了NSMutableArray。而且,H2CO3
是正确的,\NSCFConstantString
是NSString的一个具体子类,因此我们可以对其使用所有NSString方法
下面是一种在枚举NSMutableArray时修改它的好方法
NSMutableArray *tempArray = [[NSMutableArray alloc] initWithArray:self.docList];
self.listForThePopover = [[NSMutableArray alloc] init];
NSString *str;
for (int i = 0; i < [tempArray count]; i++) {
str = [tempArray objectAtIndex:i];
//NSLog(@"~str:%@~",str);
//check if the str is of the NSString class AND if it's NOT empty
if(([str isKindOfClass:[NSString class]]) && (![str isEqualToString:@""])){
//add the string to the list that we want to actually use.
[self.listForThePopover addObject:str];
//NSLog(@"Just Added:%@",str);
}
}
NSMutableArray*tempArray=[[NSMutableArray alloc]initWithArray:self.docList];
self.listforthepover=[[NSMutableArray alloc]init];
NSString*str;
对于(int i=0;i<[tempArray count];i++){
str=[tempArray objectAtIndex:i];
//NSLog(@“~str:%@~”,str);
//检查str是否属于NSString类,以及它是否为空
if(([str isKindOfClass:[NSString class]])&(![str isEqualToString:@”“])){
//将字符串添加到我们想要实际使用的列表中。
[self.listforthepover addObject:str];
//NSLog(@“刚刚添加:%@”,str);
}
}
你说得对,它不是一个真正的空字符串,也不是真正在数组中。它不会被循环,因此它不会通过任何测试或打印出来。所以我不明白为什么在打印整个数组时会在数组中看到它,为什么它会出现在我的tableView中。我读到NSCFConstantString用于编译器中的字符串优化,所以可能是字符串中的空白?但是我不知道…@jimdingo\uu NSCFConstantString
是一个用于字符串文本的类。当您在如下代码中编写常量字符串:@“foo”
时,编译器将发出此类的实例。如果它不在数组中,那么代码中的某个地方就有逻辑错误。可能也会显示日志的输出?@h2co3如果在枚举数组时试图修改数组,则可能会出现逻辑错误,这一点您是对的。空字符串从未通过测试,因为它从未被枚举!我最初设置枚举过程是为了仔细考虑逻辑错误,但愚蠢地改变了它(时间太晚了,我整天都在编码,所以我没有清晰地思考xD)