2010-12-05 5 views
9

extern 변수를 사용하려고합니다.목표 C - extern 변수를 사용하는 방법?

는 불평이 numberWithInt를 사용하는 나는의 값으로 contants을 통과하지이기 때문에 내 그래서 나는 CONST를 제거하고 통근 변수가 일정해야한다는 불평

, 그래서 여기에 솔루션 무엇 변수 ? 내가 INT

을 사용하지 않으

.h extern NSNumber const *MoveID; .m NSNumber const *MoveID = [NSNumber numberWithInt:1]; 

답변

13

다음과 같은 수행하려고 할 수 있습니다

.H @BoltClock, 당신이 될 수있는 비 상수 값을 설정할 수 없습니다 말했듯이

extern NSNumber *MoveID; 

하는 .m

NSNumber *MoveID; 
@implementation MYGreatClass 
+ (void) initialize { 
    static bool done = FALSE; 
    if(!done){ // This method will be called again if you subclass the class and don't define a initialize method for the subclass 
     MoveID = [[NSNumber numberWithInt:1] retain]; 
     done = TRUE; 
    } 
} 
+7

'MoveID'의 값은 어딘가에서 'MYGreatClass' 클래스를 만질 때까지 설정되지 않습니다. 그것이 문제가된다면 당신은 * + load 메소드를 사용할 수있다. – bbum

1

편집 : 난 그냥 완전히 죄송합니다, 질문을 놓친 오류가 발생하는 이유에 대해 무슨 일이 있었 것을 깨달았다. 나는 Jacob Relkin이 그의 대답에서 그것을 인용했기 때문에 나는 나의 대답의 첫 부분을 남겨 둘 것이다. [NSNumber numberWithInt:1]이 컴파일시 상수 값이 아니기 때문에


, 당신은 const 변수에 사용하여 만든 NSNumber을 설정할 수 없습니다.

extern NSNumber consts 인 radar이 있는데, 이는 Objective-C에서 지원되지 않는 것 같습니다. 난 당신이 in this article 설명한대로 상수 ints 또는 부동에서 NSNumber을 만들 전 처리기 매크로를 사용할 수 있습니다 같아요. 그것은 당신이 원하는 것과 거의 같지 않지만 꽤 가까운 것처럼 보입니다.

3

const 유형의 당신이 할 수 무엇

이 있습니다 : ...

NSNumber *MoveID; 
@implementation SomeClass 
static BOOL loaded = NO; 
+ (void) initialize { 
    if(!loaded) { 
     MoveID = [[NSNumber alloc] initWithInt:1]; 
     loaded = YES; 
    } 
} 
//blah blah blah 

@end 
0

그냥 완전성에 대해

extern NSNumber *MoveID; 

그리고, 현대적인 방법으로 그것을 할 수 있습니다 :에

. h

extern NSNumber *MoveID; 
initialiser가 중복되지 않도록 오직 한 번 실행하는 .m

NSNumber *MoveID; 

... 

- (void)viewDidLoad { 
    [super viewDidLoad]; 

    static dispatch_once_t onceToken; 
    dispatch_once(&onceToken, ^{ 
     MoveID = @1; 
    }); 

    ... 
} 

dispatch_once()에서3210

, 그리고 스레드 안전합니다. 또한 뷰 라이프 사이클에서 초기 화 코드를 아래로 내려갑니다.