2010-03-19 2 views
5

일부 메서드의 인수 목록이 nil으로 끝나는 이유는 무엇입니까?특정 코코아 메서드의 인수 목록이 끝내지 않는 이유는 무엇입니까?

mySet = [NSSet setWithObjects:someData, aValue, aString, nil]; 

NSArray : 나는 예를 NSSet을 위해, 특히 컬렉션 클래스에서 이것을 발견했습니다

그것은 매개 변수에 ...로 볼 방법 가변 인자리스트 작업 ( va_list, 함께 할 수있다
NSArray *objects = [NSArray arrayWithObjects:@"value1", @"value2", @"value3", nil]; 

답변

13

). 코드에서 목록의 모든 값을 추출하려고하면 중지 할시기를 알아야합니다 (그 수를 모르기 때문에). 우리는 목록의 끝을 "센티넬"이라는 특별한 값으로 나타내며, 보통 NULL입니다. 이렇게하면 처리 코드가 nil에서 va_list에 도달하면 처리 코드가 끝났음을 알 수 있습니다. nil을 생략하면 코드가 nil을 찾을 때까지 객체를 객체로 해석하면서 계속 스택을 계속 읽으므로 이상한 오류가 발생합니다.

이것은 C 문자열이 NULL- 종단점이어야하는 이유와 매우 유사합니다. 그것은이 % 수정은 형식 문자열에 얼마나 많은에 따라 필요가 얼마나 많은 매개 변수를 파악하기 때문에 보조 노트로

stringWithFormat:와 유사한 printf 스타일의 방법은 감시가 필요하지 않습니다. 따라서 형식 문자열을 @"hello, %@"으로 지정하면 하나의 추가 인수 만 찾습니다. 왜냐하면 하나의 % 수정자가 있기 때문입니다.

+6

+1하지만 ascii-art BSG 사일런은 센티널 – slf

3

Objective-C의 Variadic 함수에는 nil 인수를 제공하는 것 외에 인수 목록이 끝나는 시점을 결정할 방법이 없습니다.

+1

또는 형식 문자열에 대해 NULL보다 더 시원할 것이라고 생각합니다. (C와 동일) –

+1

또는 명시적인 인수 개수. –