2009-12-22 5 views

답변

54

당신은 extern은 코코아 프레임 워크에 광범위하게 사용되는 것을 확인할 수 있습니다 구현에 실제 NSString*을 정의하고 하나가 설득력을 찾기 위해 하드 누르면된다 그 그들의 개체 (OO)는 "버릇 없게"된다. 오히려 코코아는 캡슐화가 잘되어있어 꼭 필요한 것만 노출합니다. 전역 적으로 정의 된 상수는 확실히 가장 일반적인 용도이지만 반드시 유효한 유일한 용도는 아닙니다.

IMO, extern을 사용하면 반드시 개체 방향을 "망칠"수는 없습니다. OO 에서조차도 어디서나 액세스 할 수있는 변수를 자주 사용합니다. extern을 사용하면 Objective-C에서 "클래스 변수"(예 : Java에서 static으로 선언 된 클래스 변수)가 부족한 경우에 가장 자주 발생합니다. 심볼이 선언 된 컴파일 단위를 넘어서는 심볼을 참조 할 수있는 범위를 확장 할 수 있습니다.이 심볼은 본질적으로 누군가에 의해 정의 될 것이라고 약속함으로써 가능합니다.

extern__attribute__((visibility("hidden")))을 결합하여 편집 장치 외부에서 사용할 수 있지만 연결 장치 외부에서는 사용할 수없는 심볼을 만들 수 있습니다. 필자는 상위 수준의 내부 세부 정보를 적절하게 캡슐화하기 위해 사용자 지정 라이브러리 및 프레임 워크 코드에이 코드를 사용했습니다.

+0

흠 ..하지만 사용법이 더 많이 언급되지 않으면 코드 가독성이 떨어집니다. –

+0

클래스 선언에이 방법을 사용할 수 있습니까? (즉, http://stackoverflow.com/questions/22798660/extern-with-class-in-objective-c) – Senseful

+0

또한 FOUNDATION_EXPORT는 C++ 코드에서도 작동하므로이 점을 고려하십시오. http://stackoverflow.com/a/10953284/142358 –

10

무엇을 사용하는지에 따라 다릅니다. 전역 적으로 정의 된 상수에 액세스하려면이 함수를 사용하는 것이 좋습니다.
전역 개체가있는 경우 대신 Singleton을 사용하는 것이 좋습니다.

15

Objective-C의 extern 키워드에 대한 몇 가지 사용 사례가 있습니다.
Aaron Hillegass는 글로벌 알림 이름 extern을 만들 것을 제안합니다. 예 :

extern NSString* const XYYourNotification; 

그런 다음

+0

Hillegass의 제안에 대한 자세한 정보는 어디에서 찾을 수 있습니까? URL을 알고 있습니까? – Joshua

+1

"Mac OS X 용 코코아 프로그래밍"(Aaron Hillegass)에서 처음 보았습니다. 지금까지 읽은 최고의 코코아 관련 서적 중 하나. http://www.bignerdranch.com/book/cocoa®_programming_for_mac®_os_x_3rd_edition –

+0

왜 extern을 사용해야합니까? 정적 변수를 선언 할 수는 없습니까? 감사합니다 – aneuryzm

2

필요에 따라 예를 들어 로그인 페이지가 있습니다. 로그인하면 응용 프로그램의 다른 페이지에 알립니다.

#import <Foundation/Foundation.h> 

extern NSString *const DidLoginNotification; 

@interface LoginViewController : NSObject 
- (void)login; 
@end 


// LoginViewController.m 
#import "LoginViewController.h" 

//define extern const in implementation file only once for the whole process 
NSString *const DidLoginNotification = 
    @"DidLoginNotificationNotified"; 

@implementation LoginViewController 

- (void)login { 
    // Perform notification 
    [[NSNotificationCenter defaultCenter]; 
    sendNotificationName: DidLoginNotification 
                    object:nil]; 
} 

알림 수신자는 const의 값을 알 필요가 없습니다.