2013-04-14 2 views
3

NSLog의 구문에 대해 약간 혼란 스럽습니다. 예를 들어, NSLog 포인터 구문

 
    NSString *nameString = @"Name"; 
    NSLog(@"nameString is: %@", nameString); 
내 이해가 정확하면 (아주 ​​잘 될 수도 있음), nameString은 String에 대한 포인터로 정의됩니다. 나는 nameString이 가지고있는 메모리 주소를 출력 할 것이고 그 주소의 값은 출력하지 않을 것이라고 생각했다. 그래서 NSLog 문에서 포인터의 값을 얻으려면 nameString이 가리키는 것과 같은 것을 액세스하려면 별표 표기법을 사용해야합니다.
 
    NSLog(@"nameString is: %@", *nameString); 
? C로 프로그래밍 한 이래로 약간의 시간이 걸렸지 만 Objective-C는 C의 수퍼 세트이기 때문에 유사하게 동작 할 것이라고 생각했습니다.

설명을 크게 높이세요! 감사!

+0

메모리 주소를보고 싶다면 –

+0

감사합니다.하지만이 경우 nameString (포인터)이 가리키고있는 메모리 주소로 이동 한 이유에 대한 설명을 얻으려고했습니다. 거기에 (이 경우 문자열 "Name"). 나는 이것이 왜 효과가 있는지 이해하지 못한다. –

+0

'... % @ ", nameString]'는 [nameString description]'으로 확장됩니다. –

답변

13

% @ 명령은 수신기의 -description 메서드를 호출하는 "바로 가기"와 같습니다. NSString의 경우 NSObject에서 상속되므로 간단하게 문자열 자체를 표시 할 수 있습니다.이 클래스는 무시할 수 있습니다. 자신의 클래스를 만들면 매우 유용합니다. 이 경우 기본 비헤이비어는 포인터의 값을 인쇄합니다.
당신은 문자열의 포인터의 주소를 인쇄하려면 단지로 교체 : 당신은 포인터를 선언하는 별표 (*)를 사용하는 것이 생각

NSLog(@"nameString is: %p", nameString) 
+0

답변을 주셔서 감사합니다! 그러나이 경우 수신기 (nameString)는 단지 정수이기 때문에 (포인터이기 때문에). 날 변수 이름 문자열이 메모리 위치와 그곳에있는 값이 잡혀있는 곳에있는 것 같습니다. –

+0

첫 번째 nameString은 int가 아니라 "포인터"입니다. 포인터는 메모리는 일반적으로 16 진수 (int에 캐스트 가능)로 표시되지만 개념은 숫자와 멀리 떨어져 있습니다. 두 번째 방법은 objC에서 메소드를 전달하는 방법의 일부입니다. 메시지를 보내려면 객체에 대한 포인터가 필요합니다. 메시지를 보낼 때 메서드 클래스를 계층 적으로 검사하여 메소드를 구현하는 메소드 디스패처가 있고 메소드가 발견되면 실행합니다. 그런데 런타임의 모든 메소드는 C 함수에서 "변환"됩니다. – Andrea

+0

좋아, 이렇게 메시지를 보내려면 :

 [nameString description]
, nameString 포인터가 있어야합니까? 그런 다음 nameString이 가리키는 객체에 메서드가 호출 되었습니까? –

0

. 그런 다음 결정한 이름 만 사용합니다. 예를 들어 : 만약 내가 잘못 :)

0

그것은 개체의

NSString *foo = [[NSString alloc] initWithString:@"Hello"]; 

NSLog(@"%@", foo); 

저를 수정하고 NSLog가 인수해야 할 작업을 결정하기 위해 형식 지정을 사용하는 기능입니다. 이 경우 지정자는 % @이며 NSLog가 객체에 대한 메소드를 호출하도록 지시합니다. 일반적으로이 메서드는 NSString을 반환하는 "description"메서드를 호출하지만 먼저 respondsToMethod를 수행하고 다른 문자열 메서드로 넘어갑니다.