관련 : “ 'const NSString *'을 'NSString *'유형의 매개 변수에 보내면 한정자를 버립니다.”경고
때로는 유용하다고 생각합니다. 테이블을 전달해야하고 테이블의 내용이 변경되지 않도록하려고합니다.
그러나 대부분의 Objective-C 프로그램 샘플에서는을 볼 수 없습니다 const
. 내 질문은 왜?
관련 : “ 'const NSString *'을 'NSString *'유형의 매개 변수에 보내면 한정자를 버립니다.”경고
때로는 유용하다고 생각합니다. 테이블을 전달해야하고 테이블의 내용이 변경되지 않도록하려고합니다.
그러나 대부분의 Objective-C 프로그램 샘플에서는을 볼 수 없습니다 const
. 내 질문은 왜?
답변:
Objective-C 객체가 작동하는 방식으로 인해 const
시행을 포기하고 프로그래머를위한 표기법이 시작됩니다. 이 프로그램을 고려하십시오 :
int f(const int x) {
return ++x;
}
int main(int argc, char *argv[]) {
@autoreleasepool {
int x = 3;
NSLog(@"%d", f(x));
}
return 0;
}
실제로 컴파일되지 않습니다 (clang을 사용하고 있습니다) : 컴파일러는 기본 C 유형을 수정하려는 시도를 감지하고 오류를 발생시킵니다. 그러나 이제이 프로그램과 비교하십시오.
NSMutableString *f2(const NSMutableString * const x) {
[x appendString: @" world!"];
return x;
}
int main(int argc, char *argv[]) {
@autoreleasepool {
NSMutableString *x = [@"Hello" mutableCopy];
NSLog(@"%@", f2(x));
}
return 0;
}
함수에 상수 객체에 대한 상수 포인터가 전달 되더라도 객체를 변경하는 것은 여전히 가능합니다.
객체 지향 프로그래밍에서 객체의 지속적인 특성을 유지하는 가장 좋은 방법은 객체를 불변으로 만드는 것입니다. 즉 상태를 변경할 수있는 메소드를 제공하지 않습니다. 위의 함수가 NSString
대신 인수를 사용 하고 변경 가능한 복사본 대신 NSMutableString
리터럴을 전달 했다고 상상해보십시오 @"Hello"
. 이제 합리적으로 말하면 전달 된 객체 [*]를 변경할 가능성이 없습니다. 오브젝티브 C는 달리, 그 생각을 시행 중 어떤 방법이없는 const
또는 final
다른 객체 지향 언어에서 객체 참조.
비교를 위해 const
C ++에서 완전히 다르게 작동합니다. const
C ++ 객체에 대한 참조를 얻으면 const
해당 객체에 대한 멤버 함수 만 호출 할 수 있습니다. 이러한 함수는 const
변경하지 않거나 mutable
클래스 디자이너 가 명시 적으로 표시 한 멤버 변수 만 수정하여 객체 의 밝기를 유지합니다 . 따라서 Objective-C MutableString
와 동등한 C ++ 유형이 있다고 가정하십시오 NSMutableString
. 위의 예제와 동등한 내용은 다음과 같습니다.
MutableString& f3(const MutableString& x) {
x.appendString(" world!");
return x;
}
이것은 분명히 컴파일되지 않을 것입니다 : 연산 이 appendString()
아닌 것 외에도 const
함수는 const
을 요구하는 타입 참조에서 한정자를 제거합니다 const_cast
.
[*] 일부 왜곡 된 방법이 있기를 기대하지만, 이제 우리는 "영리한"일을함으로써 다른 프로그래머를 방해하려는 한 프로그래머의 영역에 들어 섰습니다.
const
장식을 의미있는 것으로 취급 하므로 경고를 억제하기 위해 별칭이나 캐스트와 같은 왜곡을 얻지 만 이러한 왜곡의 결과로 프로그램의 동작에는 변화가 없습니다.
const
Objective C에서 객체에 대한 포인터 가 다른 객체 를 가리 키도록 할당되지 않았다는 것을 설명하는 데 여전히 유용 할 수 있다고 생각 합니다 . 즉, 항상 동일한 문자열이며 다른 문자열이 아니라는 NSString * const x
것을 알고 x
있습니다.
Objective C가 진행되는 한 프로그래밍하지 않으므로 질문에 대답 할 수 없습니다. 그래도 대답 할 수있는 질문은 " const
목표 C로 프로그래밍 할 때 사람들 이 많이 사용해야합니까 ?"입니다. -하나는 "예"입니다.
Constness는 본질적으로 프로그램의 안정성과 유지 관리를 위해 사용되는 소프트웨어 보안 기능입니다. 많은 프로그래머들은 const
s 의 가치를 실제로 인식하지 않고 자라며 언젠가 나쁜 일이 생길 때까지 "아하"순간- "아, 그게 const
사용되는 것"입니다. 상수없이 프로그램을 작성하는 것은 전적으로 가능하며 그러한 프로그램을 신뢰할 수있게 만드는 것은 사실상 불가능합니다.
많은 코드 샘플은 실제로 프로그램이 아니라 특정 기능을 표시하도록 설계된 스 니펫입니다. const
샘플이 만들려고하는 시점에서 방해가되므로 사용하지 않습니다 . 또 다른 유형의 코드는 배운 예제 또는 상수에 대해 알고 있으며 사용하기에 너무 게으른 예제를 기반으로하는 경험이없는 프로그래머가 작성한 코드입니다.
나는 objective-c를 오랫동안 사용하지 않았다.
그러나 나는 왜 아무도이 측면을 언급하지 않았는지 궁금합니다.
Objective-c는 이미 상수와 관련된 다른 것을 가지고 있습니다. 돌연변이
예를 들어, Nstring *은 상수 문자열을 가리 킵니다. 문자열을 수정하려면 NMutableString 또는 이와 유사한 것을 사용하십시오. NMutableString은 사람들이 문자열을 수정할 수있는 추가 메소드를 제공합니다.
이제 포인터 자체를 상수로 만들고 싶다면 어떨까요? 매우 큰 프로젝트를 코딩하는 동안 걱정할 필요가 없습니다.
그래서 나는 그것이 생각합니다.