[ios] Objective-C에서 null 문자열을 확인하는 올바른 방법은 무엇입니까?

내 아이폰 앱에서 이것을 사용하고 있었다

if (title == nil) {
    // do something
}

그러나 예외가 발생하고 콘솔에 제목이 “(null)”이라는 메시지가 표시됩니다.

그래서 나는 이것을 지금 사용하고 있습니다 :

if (title == nil || [title isKindOfClass:[NSNull class]]) {
    //do something
}

차이점은 무엇이며 문자열이 null인지 확인하는 가장 좋은 방법은 무엇입니까?



답변

다른 사람들이 지적했듯이 Cocoa / Objective C에는 많은 종류의 “null”이 있습니다. 그러나 주목해야 할 또 하나의 점은 [title isKindOfClass : [NSNull class]]는 [NSNull null]이 싱글 톤이므로 포인터 평등을 확인할 수 있습니다. 코코아 주제 : Null 사용을 참조하십시오 .

따라서 좋은 테스트는 다음과 같습니다.

if (title == (id)[NSNull null] || title.length == 0 ) title = @"Something";

title이 nil 인 경우에도 title.length는 0 / nil / false, 즉이 경우 0을 반환하므로 특별한 경우가 필요하지 않습니다. 이것은 Objective C를 처음 사용하는 사람들이 익숙해 지는데 어려움을 겪었습니다. 특히 메시지 / 메소드 호출이 충돌하지 않는 다른 언어에서 발생합니다.


답변

그것은만큼 간단합니다

if([object length] >0)
{
  // do something
}

목적 C에서 object가 null이면 0을 값으로 반환한다는 것을 기억하십시오.

이렇게하면 null 문자열과 0 길이 문자열을 모두 얻을 수 있습니다.


답변

이 사이트에서 다음 관련 기사를 참조하십시오.

추가 검사를 할 필요가 없으므로 오류가 다른 것과 관련이 있다고 생각합니다.

이 관련 질문도 참조하십시오 : nil sqlite 텍스트 열의 적절한 검사


답변

나는 실제로 그것을 올바르게하기 위해서는 비슷한 것을해야한다는 것을 알았습니다.

if ( ( ![myString isEqual:[NSNull null]] ) && ( [myString length] != 0 ) ) {
}

그렇지 않으면 제어가 여전히 검사를 우회하는 이상한 상황이 발생합니다. 나는 isEqual길이 검사를 통과 한 것을 보지 못했습니다 .


답변

이 “어떻게 대답 해”? 우리는 모두 같은 언어로 코딩하고 규칙은

  1. 참조가 0 이 아닌지 확인
  2. 문자열 길이가 0이 아닌지 확인하고 확인하십시오.

그것이 모두에게 효과가있는 것입니다. 지정된 솔루션 만 “작동”하는 경우 응용 프로그램 흐름에서 참조가 null이거나 문자열 길이가 0 일 수있는 시나리오를 허용하지 않기 때문입니다.이를 수행하는 올바른 방법은 처리 할 방법입니다. 모든 경우에 원하는 것.


답변

빈 문자열이나 빈 배열 / 세트와 같은 모든 nil / empty 객체에 대해 테스트하려면 다음을 사용할 수 있습니다.

static inline BOOL IsEmpty(id object) {
    return object == nil
        || ([object respondsToSelector:@selector(length)]
        && [(NSData *) object length] == 0)
        || ([object respondsToSelector:@selector(count)]
        && [(NSArray *) object count] == 0);
}


답변

두 가지 상황이 있습니다.

객체가 [NSNull null]이거나 불가능할 수 있습니다.
응용 프로그램은 일반적으로 [NSNull null];null “객체를 배열에 넣거나 사전 값으로 사용 하려는 경우에만 사용 해서는 안됩니다 . 그런 다음 어떤 배열이나 사전에 null 값이 포함될 수 있고 그렇지 않을 수 있는지 알아야합니다.
배열에 [NSNull null]값이 포함되어 있지 않다고 생각되면 확인하지 마십시오. 이 있으면 [NSNull null]예외가 발생하지만 괜찮습니다. Objective-C 예외는 프로그래밍 오류를 나타냅니다. 그리고 일부 코드를 변경하여 수정해야하는 프로그래밍 오류가 있습니다.

객체 있다면 [NSNull null]테스트를 통해 간단히 확인할 있습니다
(object == [NSNull null]). isEqual객체의 클래스를 호출 하거나 확인하는 것은 말이되지 않습니다. 단 하나의 [NSNull null]객체가 있으며 평범한 오래된 C 연산자는 가장 간단하고 효율적인 방식으로 잘 검사합니다.

당신이 선택하면 NSString될 수 없다 객체 [NSNull null]당신이 될 수 없습니다 알고 있기 때문에 ( [NSNull null]또는 그냥 다른 것을 선택하기 때문에를 [NSNull null], 당신은 당신이 만약 길이가 0이 하나 인 빈 문자열을 치료하는 방법을 스스로에게 물어 필요 그것은이다 치료 null와 같은 문자열 nil, 다음 테스트 (object.length == 0). 경우 object.length는 0을 반환합니다 object == nil길이가 0과 객체와 문자열 전무이 테스트 커버 당신이 전무 문자열에서 다른 길이 0의 문자열을 취급한다면, 단지 경우 확인 object == nil.

마지막으로 배열이나 사전에 문자열을 추가하고 문자열이 nil 인 경우 문자열을 추가하지 @""않거나으로 바꾸거나으로 바꿀 수 있습니다 [NSNull null]. 이를 바꾸면 @""“문자열 없음”과 “길이가 0 인 문자열”을 구별 할 수 없게됩니다. 이를 대체한다는 것은 객체 [NSNull null]를 검사하는 배열이나 사전에 액세스 할 때 코드를 작성해야 함을 의미 [NSNull null]합니다.