c глобальные переменные в цели c - PullRequest
0 голосов
/ 09 февраля 2012

Я хотел бы сделать для себя какой-то приказ о глобалах.

  1. , если я напишу в моем файле .m

    int ran //is it global? every class can see it ?
    
    @implementation
    @end
    
  2. если я пишу в моем .h файле это:

    int ran //is it global to any other class that include this .h ?
    @interface
    {
    }
    
  3. если я пишу в моем .h файле это:

    extern int ran //is it global to any other class that include this .h ?
    @interface
    {
    }
    
  4. если я пишу в своем .h файле это:

    @interface
    {
    int ran //can every other class that include it can see it ?
    }
    

    AND о @interface, все, что в интерфейсе принадлежит только этому классу?что насчет *NSString в @interface?это относится только к этому классу?Могу ли я использовать его при включении этого .h?или мне нужно сделать объект этого класса, чтобы увидеть его?

Каков наилучший способ поместить глобальную переменную примитива, что только мойкласс увидит это и можно будет его использовать?

Ответы [ 3 ]

1 голос
/ 09 февраля 2012
  1. Если вы напишите (в любом модуле компиляции == .m файл)

    int ran;
    

    Fine, определяет глобальную переменную, инициализированную нулем, символ, видимый компоновщику.

  2. Если вы напишите в заголовочном файле

    int ran;
    

    Это плохая идея, поскольку каждый файл реализации (.m), который включает в себя заголовок, будет определять свой собственный экземпляр глобальной переменной. Может возникнуть путаница с линкером.

  3. Если вы напишите в заголовочном файле

    extern int ran;
    

    Отлично, объявляет глобальную переменную. Должен быть определен в одном файле реализации (.m).

  4. Если вы напишите в заголовочном файле

    @interface Foo : NSObject
    {
        int ran;
    }
    

    Это тоже нормально. Он объявляет класс Objective-C с переменной экземпляра ran. Переменная экземпляра будет создана для каждого экземпляра Foo и будет принадлежать ему. Переменная экземпляра - @protected (по умолчанию) и, таким образом, доступна напрямую из любого производного класса. Это был бы плохой дизайн, хотя.

    В настоящее время вы не объявляете переменные экземпляра в @interface класса, а в @implementation или просто @synthesize их.

Если вам нужна закрытая глобальная переменная, определите ее в файле реализации, используя:

static int ran;
1 голос
/ 09 февраля 2012

За пределами любого объявления или реализации класса,

int ran;

определяет переменную с именем ran типа int, независимо от того, находится ли эта строка в .h, .c или .m файл.Обычно это ошибка в .h, потому что если .h содержит более одного файла, переменная определяется дважды или более.

extern int ran;

указывает, что переменная с именем ran типа int был определен в другом месте, и компоновщик должен его найти.

Обычно общая структура объявления глобальных переменных в C (и, следовательно, в Objective-C):

globals.h:

extern int ran;

global.c:

int ran;

myWonderfulApp.m:

#import "globals.h"
...
ran = 42;

Если вам нужна глобальная переменная, котораяснаружи не видно .m, используйте:

static int ran;

Вы можете использовать его извне, если вы предоставляете методы получения и установки, но не если вы объявляете extern int ran; там, где вам это нужно.

0 голосов
/ 09 февраля 2012

случай 1,2,3 глобален, 4 не

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...