2014-04-03 2 views
3

나는 objective-C에서 정적 변수에 대한 연구를했고 사람들이 다른 곳에서 정적 변수를 선언함으로써 나를 혼란스럽게 만들었다.objective-c에서 정적 변수를 어디에 선언해야합니까?

  1. 다음 코드의 경우 구현 외부에 static NSUInteger counter;을 넣을 수 있습니까? (오른쪽 내 # import를 "xxx.h"후)

  2. 나는 내부 static NSUInteger counter;을 넣어 + 클래스 메소드를 초기화 할 수 있나요?

  3. 는 내가 인스턴스 메소드에 static NSUInteger counter;를 할 수 있나요?

  4. 가장 중요한 차이를 어떻게 어디를 선언하는 방법을 선택하는 방법은 무엇입니까?

고마워요!

@implementation MyClass 

static NSUInteger counter; 

+(void)initialize { 
    if (self == [MyClass class]) { 
     counter = 0; 
    } 
} 

@end 
+0

항상 가져 오기 문 아래에 있습니다. – rounak

+1

정적 변수를 명시 적으로 0으로 초기화 할 필요가 없습니다. 명시 적으로 다른 값으로 초기화되지 않으면 모든 정적 변수가 자동으로 0으로 초기화됩니다. 또한 초기화를 명시 적으로하고 싶었더라도 대개'+ initialize' 메소드를 사용할 필요가 없습니다. 그냥'status NSUInteger counter = 1; '과 같은 정의에서 이니셜 라이저 표현식을 사용하십시오. '+ initialize'와 같은 동적 인 테크닉을 사용해야 할 유일한 이유는 컴파일 타임 상수가 아닌 값으로 초기화하고자하는 경우입니다. –

답변

8

제공된 두 가지 버전 만 있습니다. 정적 변수는 클래스와 관련이 없기 때문에 구현 블록의 내부 또는 외부에서 선언하는 것 사이에는 차이가 없습니다. 같은 이유로 클래스 메소드 또는 인스턴스 메소드에서 선언하는 것과 차이가 없습니다.

방법 내부 여부를 선언 사이의 유일한 차이는,이 메소드 내에서 선언 된 경우,이 같은 방법 내에서 오직 액세스 할 수 있다는 것입니다.

그것은 당신이 그래서 어딘가 의도하지 않은 원인이 버그를 사용의 위험이없는 수있는 가장 구체적인 범위 내에서 변수를 선언하는 것이 가장 좋습니다. 메서드 내에서 정적 변수에 대한 액세스 만 필요하면 거기에 선언하십시오. 그렇지 않으면 파일의 다른 곳 (필요한 곳 ​​위)에 선언하십시오. 정확히 어디에 넣을 것인가는 그 시점에서의 스타일 일뿐입니다. 필자는 개인적으로 수입 이후이지만 @implementation (그리고 클래스를 추가하면 클래스 확장)보다 우선합니다.

+0

좋은 답변입니다! "클래스와 관련이 없지만 파일 자체와 관련이 있습니다"또는 "인스턴스와 연결되지 않지만 클래스 자체와 관련이 있음"을 의미합니까? – wz366

+3

그는 "클래스와 관련이 없지만 파일 자체와 관련이 없습니다."라는 의미입니다. – NobodyNada

1

당신은 그 모든 장소에 넣을 수 있습니다. 변수가 메소드/함수에 있으면 호출간에 값을 유지합니다. 파일의 맨 위에 있으면 해당 파일의 코드에서만 액세스 할 수 있다는 의미입니다.

(그러나 결코 다른 파일에서) 하나 개의 파일에 여러 기능/방법으로 액세스 할 글로벌 변수는 종종 다른 파일 이름이 같은 다른 변수와의 충돌을 방지하기 위해 정적으로 선언됩니다. 변수를 단일 메소드로 액세스해야하고 호출간에 값을 유지해야하는 경우 변수를 정적으로 설정하고 메소드 내에서 선언하여 코드를보다 간결하게 만들 수 있습니다.

+0

정적 변수가 호출간에 값을 유지하는지 여부에 관계없이. 또한 파일의 코드를 통해서만 액세스 할 수 있습니다. 메쏘드에서 그것을 선언하는 것은 그 메쏘드에만 더 제한되게합니다. – drewag

+0

정적 변수와 일반 변수의 차이점을 설명하려고했습니다. – NobodyNada

+0

"다른 파일에서 같은 이름의 다른 변수와의 충돌을 어떻게 방지합니까?" 설명 할 수 있니? – wz366

5

변수에 static 속성 이름의 수명 변수 및가시성을 제어한다.

정적 변수는 응용 프로그램의 전체 실행 시간 인 전체 변수과 동일한 수명을가집니다.선언 파일 내에 그런데 어떤 함수 또는 메소드 선언 외부 이름가 하나의 파일에 걸쳐 보이면

  • :

    정적 변수의 공개은 선언의 위치에 따라 .

  • 선언이 임의의 블록 내에있는 경우, 변수 이름은 해당 블록 전체의 선언 지점에서 볼 수 있습니다. 즉, 선언이 메소드/함수 본문 내에서 직접 발생하는 경우 해당 메소드/함수 내에서만 볼 수 있습니다. 예를 들어 if 문 블록 내에서 발생하면 해당 블록 외부에서 볼 수 없습니다.
관련 문제