Ios 如何测试NSMutableArray中是否存在NSCFConstantString?

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

好的,我有一个Popover,包含一个tableView,它由一个填充了字符串的
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)