2010-12-05 26 views
9

Tôi đang cố gắng sử dụng các biến bên ngoài.Mục tiêu C - Làm thế nào để sử dụng các biến extern?

Nó phàn nàn rằng vì sử dụng numberWithInt Tôi không đi qua một contants như giá trị của tôi biến

Vì vậy, tôi loại bỏ các const và nó phàn nàn rằng một biến extern phải là một hằng số, vì vậy giải pháp ở đây là gì ?

TÔI KHÔNG MUỐN SỬ DỤNG INT

.h 
extern NSNumber const *MoveID; 

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

Trả lời

13

Bạn có thể thử làm như sau:

.h

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

Lưu ý rằng giá trị của 'MoveID' sẽ không được đặt cho đến khi một nơi nào đó chạm vào lớp' MYGreatClass'. Bạn * có thể * sử dụng phương thức '+ load' nếu đó là vấn đề. – bbum

1

EDIT: Tôi chỉ nhận ra rằng tôi hoàn toàn bỏ lỡ câu hỏi và đang diễn ra về việc tại sao những lỗi đã xảy ra, oops. Tôi sẽ để lại phần đầu tiên của câu trả lời của tôi ở đây mặc dù vì Jacob Relkin trích dẫn nó trong câu trả lời của mình.


[NSNumber numberWithInt:1] không phải là một thời gian biên dịch giá trị không đổi, bạn không thể đặt một NSNumber tạo ra với nó vào một biến const.

Có vẻ như là radar về extern NSNumber const s, dường như không được hỗ trợ trong Mục tiêu-C. Tôi đoán bạn có thể sử dụng macro tiền xử lý để tạo NSNumber s từ các hằng số ints hoặc phao như được mô tả in this article. Nó gần như không giống như những gì bạn có ý định nhưng nó có vẻ là khá gần.

3

Như @BoltClock nói, bạn không thể đặt một giá trị không đổi là loại const.

Những gì bạn có thể làm là thế này:

extern NSNumber *MoveID; 

Và ...

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

@end 
0

Chỉ cần cho đầy đủ, phương pháp hiện đại là làm làm điều đó như:

trong. h

extern NSNumber *MoveID; 

trong .m

NSNumber *MoveID; 

... 

- (void)viewDidLoad { 
    [super viewDidLoad]; 

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

    ... 
} 

dispatch_once() sẽ chỉ bao giờ chạy một lần nên initialiser là không bị trùng lặp, và nó là chủ đề an toàn. Ngoài ra, đẩy mã khởi tạo xuống thấp hơn trong vòng đời của khung nhìn.

Các vấn đề liên quan