问题人生[20160330] -[NSCFString containsString:]: unrecognized selector sent to instance 0x7f9902724da0


进行字符串搜索比对时用到的方法 containsString,在iOS7中运行时发生崩溃:

-[NSCFString containsString:]: unrecognized selector sent to instance 0x7f9902724da0

查询API文档可知containsString的定义如下

- (BOOL)containsString:(NSString *)str NS_AVAILABLE(10_10, 8_0);

从中可以看到 containsString 是iOS8中才出现的API,所以在小于iOS8的系统中运行将导致程序崩溃。


解决方法:

<1>.判定系统版本,当系统版本号大于或等于8.0时才用containsString,否则采用原始判定方式rangeOfString;

<2>.直接使用rangeOfString,实际上containsString就是rangeOfString的一个简单封装;

下面做一个简单测试

    NSString *str = @"ddd";
    NSString *str2 = nil;
    
    NSLog(@"%d", [str containsString: str2]);</span>
运行后程序将崩溃

*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '*** -[__NSCFConstantString rangeOfString:options:range:locale:]: nil argument'
我们看到了,containsString 调用了rangeOfString。


<3>.使用Category给NSString增添新的方法containsString,覆盖掉系统的方法;

NSString+MyTools.h

#import <Foundation/Foundation.h>

@interface NSString (MyTools)

- (BOOL)containsString:(NSString *)str;

@end


NSString+MyTools.m

#import "NSString+MyTools.h"

@implementation NSString (MyTools)

- (BOOL)containsString:(NSString *)str{

    return [self rangeOfString: str].location != NSNotFound;
}

@end
由于rangeOfString使用起来有点小复杂,在iOS8对其进行简单封装诞生了containsString,用起来简单方便,但是为了程序的兼容性,需要做一些处理工作。




你可能感兴趣的:(ios开发,ios7,崩溃,unrecognized,containsString,selecto)