Как использовать ключевое слово extern для определения глобальных ivars в IOS?

Как использовать ключевое слово extern для определения глобальных ivars, кто-нибудь знает этот вопрос? Заранее спасибо.

Обновление из комментариев:

Хорошо, я поискал в Интернете, что мне следует объявить переменную в файле .h, как показано ниже,

int name;
@interface testGlobal : NSObject
@end

И когда я хочу использовать его в одном файле .m, я должен написать, как показано ниже,

extern int name;
@implementation ViewController

When I use it in the implementation file,I got the following error

duplicate symbol _name in:
/Users/jay_Gao/Library/Developer/Xcode/DerivedData/Audition-bahpwhcmpnzxppajcliyuhtuaywz/Build/Intermediates/Audition.build/Debug-iphonesimulator/Audition.build/Objects-normal/x86_64/Test.o
/Users/jay_Gao/Library/Developer/Xcode/DerivedData/Audition-bahpwhcmpnzxppajcliyuhtuaywz/Build/Intermediates/Audition.build/Debug-iphonesimulator/Audition.build/Objects-normal/x86_64/testGlobal.o
ld: 1 duplicate symbol for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)'
, can you explain this please? – I build successfully by remove the #import "testGlobal.h" from test.m. But what if I want to import that file testGlobal.h in other files, can not I do it? Should I only declare the global variable in AppDelegate.h? Since on other file will import AppDelegate.h?

Я тестирую это со своей стороны, и я могу успешно его построить, но меня смущает, почему глобальная переменная должна быть объявлена ​​таким образом. Переменная находится вне любого блока кода.


person Jay    schedule 29.08.2015    source источник
comment
Сначала узнайте, что такое ивар.   -  person zaph    schedule 29.08.2015
comment
ivar - это переменная, она отличается от свойства   -  person Jay    schedule 29.08.2015
comment
Нет. Ivar - это сокращение от переменной экземпляра. Обратите внимание на пример, это подразумевает экземпляр чего-то, global не подразумевает экземпляр чего-либо. Кстати, в наши дни вам нужно указать язык, теги - хорошее место для этого.   -  person zaph    schedule 29.08.2015
comment
Вы name объявили где-то еще. Полное сообщение об ошибке всегда лучше, чем его часть, обновите вопрос с его помощью.   -  person zaph    schedule 29.08.2015
comment
Если вы определяете переменную в файле заголовка (.h), она в конечном итоге объявляется в каждом файле реализации (.m), который импортирует файл заголовка. По сути, заголовочный файл копируется в файлы, заменяя # include / # import. Вот почему появляются повторяющиеся сообщения об ошибках. Как демонстрирует @psobko, extern в заголовке объявляется в одном файле реализации.   -  person zaph    schedule 29.08.2015
comment
Причина, по которой глобальные переменные работают таким образом (или почему существует даже нечто, называемое заголовочными файлами), чисто историческая. Мы говорим об эпохе, когда компиляторы могли компилировать по одному файлу за раз и только последовательно. Это немного сложно объяснить без предварительных знаний о компиляторах и других языках. Дело в том, что глобальные переменные вообще не должны использоваться. Всегда есть лучшие способы реализовать что-то, чем использование глобальной переменной.   -  person Sulthan    schedule 29.08.2015


Ответы (1)


Вам нужно extern его в интерфейсе и объявить в реализации вашего класса testGlobal:

//Global.h
extern int xyz;

@interface Global : NSObject
@end

//Global.m
#import "Global.h"

int xyz = 123;
@implementation Global
@end

//ViewController.m
#import "ViewController.h"
#import "Global.h"

@implementation ViewController

- (void)viewDidLoad {
    NSLog(@"%d", xyz);
    [super viewDidLoad];
}
person psobko    schedule 29.08.2015