2012-01-10 3 views
12

main.m 파일에 변수를 선언하여 모든 클래스에서 사용할 수 있도록하려면 어떻게해야합니까?objective-c - 전역 변수

단순히 main 함수에서 선언하면 컴파일러에서 클래스 메서드에서 선언하지 않는다고 말합니다.

나는 이것을 다음과 같이 선언해야합니까?

@public 
type variable; 

답변

25

일반적인 오래된 전역 변수를 사용하면됩니다.

먼저 main 기능을하기 전에, 당신의 main.m에 변수를 정의 :

#import <...> 

// Your global variable definition. 
type variable; 

int main() { 
    ... 

둘째, 다른 소스 파일이 그것에 대해 알 수 있도록해야합니다. 그렇지 않으면 그 정의되고, 당신이 선언 블록의 변수에 값을 할당 할 수 없습니다

// .h file 

// Declaration of your variable.  
extern type variable; 

주 : 당신은 당신이 당신의 변수를 필요 .m 파일을 일부 .h 파일을 선언하고 모두 해당 파일을 가져와야합니다 변수와 동일한 이름의 여러 정의에 대해 불평하는 링커 오류로 끝납니다. 각 변수는 가 (선언이 변수가 어딘가에 존재한다는 것을 말한다) 여러 번 선언 할 수 있지만, 는 (정의는 실제로 변수에 대한 메모리를 생성) 한 번만 정의 :

명확한 것을 확인하십시오.

그러나 전역 변수는 파일에서 예기치 않게 변경 될 수 있으므로 오류를 디버깅하는 데 어려움이있을 수 있으므로 잘못된 코딩 방법입니다. 예를 들어, Singleton 패턴을 사용하여 전역 변수를 피할 수 있습니다.

+0

이 이모, 전역 변수가 실제로 목표 C에서 많은 감각을, 경향 주어진 :

는 다음 링크를 상수와 정적 변수에 대한 자세한 내용을 보려면 싱글 톤, 특히 뷰 컨트롤러. 이 경우 변수보다는 상수처럼 작용합니다. – devios1

+0

실제로 싱글 톤은 전역 변수 (공유 인스턴스)를 사용하여 모든 구성원을 전역으로 만듭니다. 당신은 한 종류의 세계화를 다른 세계화로 바꾸고 있습니다. – Cristik

10

왜 그렇게하고 싶은지 잘 모르겠지만 원하는 경우 할 수 있습니다.

main.m :

int someGlobal = 0; ///< Added outside any function, at the top say. 

SomeClass.m :

extern int someGlobal; ///< Added at the top, outside the class implementation. 

... 

- (void)useGlobal { 
    NSLog(@"someGlobal = %i", someGlobal); 
    someGlobal = 5; 
    NSLog(@"someGlobal = %i", someGlobal); 
} 

그러나,이 같은 것을 사용에 착수하기 전에 신중하게 생각하시기 바랍니다!

+0

조심해야하는 이유는 무엇입니까? 위험 요소가 무엇인지 이해할 수 없습니다. – Sirens

+1

위험 요소는 유지 관리 할 수없는 코드이거나 버그 추적이 어려울 수 있습니다. – mattjgalloway

+0

인터넷에서 글로벌 바 (vars)에 관한 모든 게시물에는 "주의하십시오"라는 경고와 "조심해야하는 이유"라는 경고가 있습니다. 하하, 항상 같은 재즈입니다. 조심하고 싶지 않은 사람들 : 다른 사람들이 반복해서 경고하는 이유에 대해 숨겨진 이유가 있다고 생각하십시오.) – tothemario

2

디버깅 외에도 main.m 파일을 직접 수정하여 응용 프로그램 로직과 상호 작용할 이유가 없습니다.

필요에 따라 Your_project_name_Prefix.pch 파일에서 상수를 정의 할 수 있습니다. 또는 응용 프로그램 대리자 또는 응용 프로그램의 클래스에 정적 변수를 선언 할 수 있습니다. 자연적으로 수 많은 것들을 위해

http://iosdevelopertips.com/objective-c/java-developers-guide-to-static-variables-in-objective-c.html

+0

var에 대한 읽기 쓰기 권한이 필요하다면이 방법은 효과가 없습니다. E. g. 모든 클래스에서 액세스 할 수있는 암호 또는 세션 ID를 저장하려는 경우 –