如何测试 NSMutableArray 中是不是存在 _NSCFConstantString?

Posted

技术标签:

【中文标题】如何测试 NSMutableArray 中是不是存在 _NSCFConstantString?【英文标题】:How to test if there is an _NSCFConstantString in an NSMutableArray?如何测试 NSMutableArray 中是否存在 _NSCFConstantString? 【发布时间】:2013-07-06 05:40:08 【问题描述】:

好的,所以我有一个包含 tableView 的 Popover,它由填充字符串的 NSMutableArray 填充。但是我的NSMutableArray 中总是有一个blank/empty 字符串,而我的弹出表中总是有一个空单元格。我单步执行我的项目,发现空字符串是字符串常量(_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);
        
    

第一个 if 语句是一个检查以删除我数组中的任何 NSNull 对象。不幸的是,这并没有摆脱字符串常量:/

谢谢,非常感谢您的帮助。

【问题讨论】:

【参考方案1】:

好吧,所以我犯了在枚举时修改 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);
    

【讨论】:

【参考方案2】:

但这不起作用,我假设是因为我的数组中的空字符串是_NSCFConstantString...?

不完全是。 _NSCFConstantStringNSString 的具体子类,所以它应该可以工作。

也许字符串不是真的和空字符串,或者它不在数组中。偶然检查它是否是一个空间(或更多)。检查其length 属性等。

顺便说一句,在枚举可变集合的同时修改它是一个非常糟糕的主意,这会导致逻辑错误。在这种情况下,也许这也是您当前问题的一部分。

【讨论】:

你说得对,它并不是真正的空字符串,也不是真正的数组。它不会被循环,因此为什么它没有通过任何测试或打印出来。所以我不明白为什么我在打印整个数组时会在数组中看到它,以及为什么它会出现在我的 tableView 中。我读到 NSCFConstantString 用于编译器中的字符串优化,所以也许它是我的字符串中的空白?但我不知道... @Jim-Dingo __NSCFConstantString 是一个用于字符串文字的类。当您像这样在代码中编写一个常量字符串:@"foo" 时,编译器会发出此类的一个实例。如果它不在数组中,那么您的代码中某处存在逻辑错误。也许也显示你的日志输出? @H2CO3关于在枚举数组时尝试修改数组时可能发生的逻辑错误,您是对的。空字符串从未通过测试,因为它从未被枚举!我最初设置枚举过程是为了仔细考虑逻辑错误,但是做了一个愚蠢的改变它的举动(已经很晚了,我整天都在编码,所以我没有想清楚xD)

以上是关于如何测试 NSMutableArray 中是不是存在 _NSCFConstantString?的主要内容,如果未能解决你的问题,请参考以下文章

如何访问 NSMutableArray 中的 JSON 数据?

如何在 NSMutableArray 中选择特定索引并存储在 nsarray [关闭]

您将如何对内存分配器进行单元测试?

如何在ios的同一个Nsmutablearray中存储旧值和新值

如何将 NSMutableArray 转换为 NSArray?

如何将唯一对象添加到 nsmutablearray?