我在
中收到了警告信息NSCharacterSet *myCharSet3 = [NSCharacterSet characterSetWithCharactersInString:query3];
int chr_count3;
chr_count3=[myCharSet3 count];
如何修复该警告?
答案 0 :(得分:4)
具体而言,NSCharacterSet
个实例不响应选择器count
。
如果您将count
实现为类别方法(应该加上前缀以避免冲突),那么您需要包含声明它的头文件。
尝试在运行时调用此方法将引发异常(或者它可能已经作为私有方法实现,在这种情况下不会有异常;但您不应该依赖于此。)
答案 1 :(得分:3)
NSCharacterSet没有正式提供计数方法。但是在我的测试中,[myCharSet3 count]实际上给出了正确的结果。所以只是为了摆脱警告:
chr_count3 = (int)[myCharSet3 performSelector:@selector(count)];
但我认为这不是一个好主意。
答案 2 :(得分:0)
以下是count
NSCharacterSet
的实现。我假设NSCharacterSet内部使用API中公开的bitmapRepresentation
,characterIsMember
依赖于此并且速度很快。直接对bitmapRepresentation
数据进行指针操作可能会更快(参见Apple关于后一种方法的文档,如何测试成员资格),但我宁愿坚持这个可读的版本。在大多数情况下,65536次迭代的循环并不是那么糟糕,如果经常调用它,您还可以在处理不可变类时缓存返回的值。将“foobar”替换为您自己的前缀,以避免与count
的私有内部实现发生冲突。
- (NSUInteger)foobar_count
{
NSUInteger count = 0;
for (NSUInteger i = 0; i < 8192 * 16; i ++)
{
if ([self characterIsMember:(unichar)i])
{
count ++;
}
}
return count;
}