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];
    }
}


반응형



UINavigationController 의 생성과 이동에 대해 알아보자.

1. 초기화
UINavigationController 를 초기화 할 때 넘겨주는 RootViewController 는 쉽게 내비게이션이 시작될 ViewController 라고 생각하면 된다.

UIViewController* viewCon =[[UIViewController alloc] init];
UINavigationController* navCon =[[UINavigationController alloc] initWithRootViewController:viewCon];



2. 뷰 이동
내비게이션컨트롤러에서 뷰를 이동하는 방법들을 보면 스택(stack) 구조인 push/pop 으로 처리를 하고 있다. 단순하고 뷰를 쌓고 빼는 구조로 사용된다고 생각하면 된다.


// 최상위 뷰로 돌아간다. (여러 뷰가 쌓였을때 사용)
[navCon popToRootViewControllerAnimated:YES];
// 사용자가 지정하는 뷰로 돌아간다. (예를 들어 A_ViewCon, B_ViewCon, ... , Z_ViewCon 이 쌓인 상태에서 B_ViewCon 을 선택해주면 Z에서 B로 한번에 이동)
[navCon popToViewController:savedViewCont animated:YES];
// 한단계 앞으로 돌아간다.
[navCon popViewControllerAnimated:YES];

// 새로운 뷰로 이동한다.
[navCon pushViewController:nextViewCon animated:YES];


반응형




CLLocationManager 를 이용한 간단한 위치정보 사용 코드를 구현해보자.

CLLocationManager 클래스는 CoreLocation.framework 에 포함되어 있다.

.h 파일
 

@property (nonatomic, retain) CLLocationManager *locationManager;  // 위치 정보를 관리할 매니저 객체
 
 .m 파일
 

- (void)viewDidLoad
{
    [super viewDidLoad];
    if (locationManager == nil) {
        locationManager= [[CLLocationManager alloc] init];
    }
    locationManager.delegate= self; // 델리게이트 연결
}

// 위치 정보 갱신을 시작
- (void) startUpdateLocation {
    NSLog(@"Location update start");

    if (locationManager == nil) {
        locationManager= [[CLLocationManager alloc] init];
    }

    locationManager.desiredAccuracy= kCLLocationAccuracyBest; // 정밀도 옵션을 선택해준다. (종류는 아래 참조)
    [locationManager startUpdatingLocation];
}

// 위치 정보 갱신을 종료 
- (void) stopUpdateLocation {
    NSLog(@"Location update stop");

    [locationManager stopUpdatingLocation];
}
 
#pragma mark - CLLocationManagerDelegate
 
// 위치 정보가 갱신될때 받는 델리게이트.
- (void)locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation *)newLocation fromLocation:(CLLocation *)oldLocation {
    NSLog(@"Location is changed");

    NSLog(@"Altitude : %f", newLocation.altitude);
    NSLog(@"Latitude : %f", newLocation.coordinate.latitude);
    NSLog(@"Longitude : %f", newLocation.coordinate.longitude);
}


desiredAccuracy 는 센서의 정밀도를 설정하고, 아래와 같은 종류가 있다. 


● kCLLocationAccuracyBestForNavigation;

● kCLLocationAccuracyBest;

● kCLLocationAccuracyNearestTenMeters;

● kCLLocationAccuracyHundredMeters;

● kCLLocationAccuracyKilometer;

● kCLLocationAccuracyThreeKilometers;


정밀도가 올라갈 수록 베터리 소모가 심해지니 필요에 따라 사용하면 된다.

반응형