2010-06-16 1 views
0
// in ClassA.h 
static NSString *globalStr = @"HelloWorld"; 

@interface ClassA 
    ... 
@end 

// in ClassB.h 
#include "ClassA.h" 

// in ClassB.m 
... 
NSLog(@"The global string: %@", globalStr); 
... 

В C++ «статический» должен означать, что переменная или функция имеют внутреннюю связь.
Но он используется для совместного использования переменной в этом случае, ошибка будет происходить без ключевого слова static.Статическая глобальная переменная в Obj-C?

Я смущен, может ли кто-нибудь сказать мне концепцию?
Спасибо!

ответ

5

static означает то же самое в Objective-C, что и в C - он имеет внутреннюю связь и статическую продолжительность хранения. Вы получите ошибку без static в этом случае, потому что у вас будет дублированный символ globalStr в каждом объекте, в исходный код которого ClassA.h. Вы не обмен ничего - вы получаете новую копию globalStr для каждой единицы компиляции.

Не ставьте определения объектов в свои заголовки, и вам будет лучше. Если вы хотите единую глобальную строку, вам нужно поставить

extern NSString *globalStr; 

В ClassA.h, и определить его в точно один файл реализации как:

NSString *globalStr = @"HelloWorld"; 
+1

Это помогает помнить, что заголовки * буквально скопированы * в файл, в который они включены. Вы не «разделяете» эту переменную с другими файлами, которые импортируют заголовок - заголовок вызывает все эти файлы, каждый из которых содержит объявление «static NSString» globalStr = @ «HelloWorld» ' , – Chuck

+0

Думаю, я должен был добавить, что у вас будет такая же ошибка в C++ .... –

+0

Спасибо, но я действительно не знал, почему существует «дублирующий символ». Не могли бы вы объяснить больше, еще раз спасибо. –