NSString에서 rangeOfStrting을 사용할 때 nil argument 관련 크래쉬가 발생할 때가 있다. 


아래 상황을 살펴보자.


- (void)test {
    NSString* baseStr = @"test";
    NSString* rangeStr = nil;
    
    NSRange range = [baseStr rangeOfString:rangeStr];
    NSMutableAttributedString * string = [[NSMutableAttributedString alloc] initWithString:baseStr];
    [string addAttribute:NSForegroundColorAttributeName value:[UIColor redColor] range:range];
}


위와 같이 rangeOfString 에 nil 값을 가진 변수가 사용되면 아래와 같은 크래시가 발생한다.

 *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '*** -[__NSCFConstantString rangeOfString:options:range:locale:]: nil argument'


따라서 rangeOfString 함수를 사용할 경우에는 nil 값을 가진 변수를 사용하지 않도록 주의가 필요하며, 변수에 들어오는 값을 알 수 없는 경우에는 아래와 같은 예외처리로 크래시를 막을 수 있다.

- (void)test {
    NSString* baseStr = @"test";
    NSString* rangeStr = nil;
    
    if ([rangeStr length]) {  // string 이 있을때 플로우를 타도록 예외처리 추가
        NSRange range = [baseStr rangeOfString:rangeStr];
        NSMutableAttributedString * string = [[NSMutableAttributedString alloc] initWithString:baseStr];
        [string addAttribute:NSForegroundColorAttributeName value:[UIColor redColor] range:range];
    }
}


반응형