programing

Objective-C에서 별표 배치

shortcode 2021. 1. 19. 07:32
반응형

Objective-C에서 별표 배치


방금 VB .Net 및 C # .Net 배경에서 오는 Objective-C를 배우기 시작했습니다. 나는 포인터 사용법을 이해하지만 Objective-C 예제에서 여러 다른 위치에 별표가있는 것을보고 내가 할 수있는 것처럼 검색해도 이것이 이유에 대한 답을 찾을 수 없었습니다. 내가 시도하는 모든 검색은 포인터에 대한 모든 종류의 설명 (실제로 필요하지 않음)을 표시하지만 별표의 다른 위치에 대한 이유 / 효과에 대한 단일 언급은 아닙니다. 내가 본 몇 가지 예는 다음과 같습니다.

NSString *string;
NSString * string;
(NSString *) string;
NSString* string;

별표의 이러한 다른 위치는 무엇을 의미합니까? 나는 그것이 간단한 대답이라고 확신하지만 지금까지 Apple 튜토리얼 및 참조 문서 또는 온라인에서 찾을 수 없다는 것이 실망 스럽습니다.

누군가 내 불행을 끝내고이 난해한 질문에 답해 주시겠습니까? 감사!


차이는 없지만 첫 번째 "토큰"(즉, 말하자면)만이 유형 이름을 정의하고 *는 유형 이름의 일부가 아님을 알아야합니다. 즉 말하자면:

NSString *aString, bString;

에 대한 포인터 하나 NSStringNSString. 둘 다 포인터가되도록하려면 다음 중 하나를 수행하십시오.

NSString *aString, *bString;

또는:

NSString *aString;
NSString *bString;

1.  NSString *string;
2.  NSString * string;
3.  (NSString *) string;
4.  NSString* string;

1, 2 및 4는 정확히 동일합니다. 모든 스타일입니다. 원하는 것을 선택하거나 혼합하십시오.

선택 # 3은 또 다른 의미를 가지고 있으며 캐스팅에 사용됩니다. 예를 들면 :

t = (NSString *)string ;

포인터로 캐스팅 string됩니다 NSString.

그러나 선택 # 3은 아마도 .h 파일 또는 .m 파일의 함수 정의에서 사용할 구문입니다. 실제 함수 내에서 "실행"되는 코드에서는 다른 의미를 갖습니다.


차이는 없습니다. 스타일의 문제입니다. 그들은 모두 stringNSString에 대한 포인터 라는 변수를 선언합니다 . 괄호는 유형 선언임을 명확히하기 위해 일부 컨텍스트 (특히 메서드 선언)에서 필요합니다.


별표를 어디에 두든 상관 없습니다. 모든 명령문은 NSString 유형의 포인터를 생성합니다.

한 줄에 여러 변수 이름을 사용할 때는 각 변수에 별표를 써야합니다.

NSString * nsstring, * nsstring2;

1.  NSString *string;
2.  NSString * string;
3.  (NSString *) string;
4.  NSString* string;

1,2 및 4는 동일합니다. C 언어 (및 C의 Objective-C 상위 집합)는 공백에 민감하지 않은 구문을 지정합니다. 따라서 스타일에 따라 원하는 공간을 자유롭게 추가 할 수 있습니다. 모든 관련 구문 비 공백 문자에 의해 분리된다 (예를 들어 {, }, ;, 등) [1].

3은 유형 캐스트 ​​( NSString*선언 된 유형에 관계없이 유형 을 사용하도록 C 컴파일러에 지시합니다 string. Objective-C에서는 객체 인스턴스의 유형 캐스팅이 거의 필요하지 않습니다. id모든 객체의 인스턴스를 참조 할 수있는 변수에 유형을 사용할 수 있습니다. 유형.

메서드 선언에서 구문 3 (종종 세미콜론이없는 경우도 있음)을 사용하여 메서드 매개 변수 유형을 선언합니다. Objective-C 메서드는 다음과 같습니다.

- (void)myMethodThatTakesAString:(NSString*)string;

이 선언에서 명명 된 인수의 유형 string은 type입니다 NSString*(선행 -은 클래스 메소드와 반대되는 인스턴스 메소드를 나타냄). 둘 이상의 매개 변수가있는 메서드 선언은 다음과 같습니다.

- (void)myMethodTakingAString:(NSString*)string andAnInteger:(NSInteger)intParam;

[1] 이것은 공백을 블록 구분 기호로 사용하는 Python과 같은 언어와 비교됩니다.


차이가 없으며 *포인터 선언에 배치되는 위치는 관련이 없습니다.


차이가 없습니다. 공백 배치는 무관합니다.


전혀 차이가 없습니다. NSString * mystring과 NSString * myString은 동일합니다.


실제로 모두 동등합니다 : nsstring에 대한 포인터 !!


*는 표준 C에서와 동일한 방식으로 작동합니다.

이것은 *를 다른 위치에 두는 것과 그 기능에 대한 좋은 입문서입니다 : http://boredzo.org/pointers/


이것들 사이에는 전혀 차이가 없습니다.


1, 2 및 4는 동등하며 NSString에 대한 포인터를 정의합니다. 개인적으로 선호하는 것은 가능한 한 K & R을 모방하는 것이므로NSString *string;

(NString*)string; 유효한 진술이지만 실제로는 그 자체로 아무것도하지 않습니다.

$ cat foo.m
#include <Cocoa/Cocoa.h>

void foo()
{
    NSString *string;

    (NSString*) string;  // doesn't do anything
    42;   // doesn't do anything either
}

$ gcc -Wall -c foo.m
foo.m: In function 'foo':
foo.m:7: warning: statement with no effect
foo.m:8: warning: statement with no effect

xcode4 문서 샘플 코드에서 항상 3. MoveMeView.m에서 볼 수 있습니다.

#if 1

- (void)growAnimationDidStop:(NSString *)animationID finished:(NSNumber *)finished context:(void *)context {

#define MOVE_ANIMATION_DURATION_SECONDS 0.15

[UIView beginAnimations:nil context:NULL];
[UIView setAnimationDuration:MOVE_ANIMATION_DURATION_SECONDS];
placardView.transform = CGAffineTransformMakeScale(1.1f, 1.1f); 
/*
 Move the placardView to under the touch.
 We passed the location wrapped in an NSValue as the context.
 Get the point from the value, then release the value because we retained it in touchesBegan:withEvent:.
 */
NSValue *touchPointValue = (NSValue *)context;
placardView.center = [touchPointValue CGPointValue];
[touchPointValue release];
[UIView commitAnimations];
}

There may not be any differences in the alternatives 1, 2 and 4 to the computer but there are to other readers of the code.

Since explanations like https://stackoverflow.com/a/1521382 and https://stackoverflow.com/a/16040884 and https://www.tutorialspoint.com/objective_c/objective_c_pointers.htm use the first alternative:

1. NSString *string;

and all extra variables need their own asterisk like in:

NSString *aString, *bString;

my humble suggestion is that we use alternative 1 as a standard.

ReferenceURL : https://stackoverflow.com/questions/1105815/placement-of-the-asterisk-in-objective-c

반응형