2009-06-18 5 views
42

iTunes U의 Stanford iPhone 과정에서 손을 잡고 있습니다. 포인터에 대해 약간 혼란 스럽습니다. 첫 번째 과제에서, 나는 오류가 발생이NSInteger를 *로 선언하지 않는 이유는 무엇입니까?

NSString *processName = [[NSProcessInfo processInfo] processName]; 
NSInteger *processID = [[NSProcessInfo processInfo] processIdentifier]; 

같은 일을 시도, 맹목적으로 주위 tinkeing 후, 나는 그것이 문제의 원인이 된 NSInteger 줄에 *는 것을 발견했다.

그래서 나는 분명히 무슨 일이 일어나고 있는지 이해하지 못합니다. 나는 그것이 어떻게 작동한다고 생각하는지 설명 할 것이고 아마도 누군가 그 결함을 지적하기에 충분히 친절 할 것입니다.

웹 개발과 달리 이제는 웹 개발보다 메모리에 대해 걱정할 필요가 있습니다 ( ). 그래서 내가 변수를 만들면 비트의 메모리가 할당됩니다 (RAM I 가정). 변수를 전달하는 대신 주변 메모리의 비트를 포인터로 전달합니다. 포인터는 변수 이름 앞에 *를 붙여 선언됩니다.

내가 맞다고 가정 할 때, 나는 왜 내가 NSInteger를 위해 그것을 할 필요가 없는지 궁금한가요?

답변

68

NSInteger은 프리미티브 유형이므로 은 스택에 로컬로 저장할 수 있습니다. 포인터를 사용하여 액세스 할 필요는 없지만 원하는 경우 포인터를 사용할 수 있습니다. 줄 :

NSInteger *processID = [[NSProcessInfo processInfo] processIdentifier]; 

은 주소가 아닌 실제 변수를 반환합니다. 당신이 정말로 하나를 원하는 경우가 NSInteger에 대한 포인터를 가질 수

NSInteger processID = [[NSProcessInfo processInfo] processIdentifier]; 

:이 문제를 해결하려면, 당신은 *를 제거해야

NSInteger *pointerToProcessID = &processID; 

앰퍼샌드 연산자의 주소입니다. 변수의 정수가 아닌 메모리에있는 변수의 주소와 동일한 NSInteger에 대한 포인터를 설정합니다.

+0

매우 유용한 팁이 될 것으로 생각됩니다. 감사. – gargantuan

+2

webdev에서 iPhone 개발로 옮겨 갔을 때 저에게는 큰 장애가되었습니다. 조심해야 할 다른 하나는 NSArray를 nil로 끝내는 것입니다. –

+3

NSInteger 또는 Xcode에서 혼동스러워하는 다른 유형을 Apple- 두 번 클릭하면 다음과 같은 정의로 넘어갈 수 있습니다. typedef int NSInteger; 결국 그것은 평범한 오래된 int입니다. –

25

NSInteger*으로 선언하지 않는 이유는 개체가 아니기 때문입니다.

는 32 비트 응용 프로그램에서 사용되고있는 경우
#if __LP64__ 
typedef long NSInteger; 
#else 
typedef int NSInteger; 
endif 

, 그것은 32 비트 정수, 그리고 그것은 64 비트 응용 프로그램에 내장 된 않다면, 그것은 64의 일 : NSInteger 단순히 int 또는 long입니다 비트 정수.

은 물론, 당신은 포인터와 같은 NSInteger을 통과 할 수 있지만, 대부분의 기능은 단순히 NSInteger 아니라 그것에 대한 포인터 인수를.

개체는 다른 함수로만 포인터로 전달할 수 있습니다. 이는 객체에 동적으로 할당 된 메모리가 있기 때문에 스택에서 선언 할 수 없기 때문입니다. int 또는 long에는 할당 된 고정량의 메모리가 있으므로 문제가되지 않습니다.

2

NSInteger는 int, AFAIK의 typedef입니다.

+1

그럴 수는 있지만 어디 에나있을 수는 없습니다. 64 비트 Mac OS X 시스템에서 'NSInteger'는 'long'으로 정의됩니다. 언젠가 iOS를 실행하는 아키텍처에서 이것이 사실 일지는 상상하기 어렵지 않습니다. –

3

*은 "포인터"를 의미합니다. object 변수는 객체에 대한 포인터를 가지고 있으므로 *; NSInteger 변수는 NSInteger에 대한 포인터가 아닌 NSInteger를 보유하므로 *이 없습니다. 그 변수에 *을두면 정수 변수를 포인터 변수에 넣었 기 때문에 적어도 경고를줍니다.

관련 문제