проблема с объявлением глобальной переменной в цели c - PullRequest
0 голосов
/ 27 февраля 2009

у меня есть глобальная переменная в 1 класса, как classA.h

const NSString *global;

classA.m

global=[array objectAtIndex:0];//a array store sort of string

и в другом классе я хочу вызвать эту глобальную переменную

classB.m

import "class.h"

NSLog(@"%@",global);

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

Ответы [ 2 ]

3 голосов
/ 27 февраля 2009

В шапке используйте:

extern const NSString *global;

и в реализации (.m):

const NSString *global;

Ссылка "extern" сообщает всем, включая файлы, что переменная существует, но она объявлена ​​в другом месте. Наконец, в вашем файле реализации вы помещаете фактическую декларацию.

1 голос
/ 28 сентября 2010

Вы не можете так делать.

const NSString *global;
NSString const *global;

оба означают указатель (который можно изменить) на постоянный NSString объект. В Objective-C постоянные объекты не имеют смысла. Компилятор не может обеспечить константность объектов. Он не может знать, изменяет ли метод внутреннее состояние объекта или нет. Также все классы в библиотеке всегда принимают указатели на непостоянные объекты в качестве параметров для своих методов, поэтому наличие любых указателей на константные объекты вызовет много предупреждений.

С другой стороны, существуют постоянные указатели на объекты, которые объявлены так:

NSString * const global;

Это означает, что указатель указывает на обычный объект NSString, но его значение нельзя изменить. Это означает, что вам также нужно инициализировать значение указателя (его нельзя изменить позже). Это используется для определения констант. Но это работает только с NSStrings и строковыми литералами. Для всех других классов нет способа указать постоянный объект времени компиляции, необходимый для инициализации. И в этом случае это истинная константа - строковые литералы неизменны по определению.

Но в вашем случае вы можете покончить с const. Вы хотите изменить указатель позже, чтобы он не мог быть NSString * const. Если вы настаиваете на глобальном, вам просто нужно сделать его регулярным NSString *. С другой стороны - глобалы - это зло. Вы должны изменить свой дизайн, чтобы он вам не понадобился.

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