Bezdepbonusu7Программирование: статьи и ответы

Вопрос

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

Автор вопроса: JayОтветов: 1

Как использовать ключевое слово 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?

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

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

iosobjective-cglobal

Ответы

Ответ 1 · psobko

Вам нужно 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];
}

Перевод вопроса и ответов сообщества Stack Overflow, лицензия CC BY-SA. Оригинал на Stack Overflow.

Похожие материалы