2009-12-22 3 views

ответ

54

Вы обнаружите, что extern широко используется в рамках какао, и один будет трудно нажим, чтобы найти убедительные аргументы, что их ОО «испорчено». Напротив, Cocoa хорошо инкапсулируется и только раскрывает то, что нужно, часто через extern. Определенные глобально константы, безусловно, являются наиболее распространенным использованием, но не обязательно единственным действительным использованием.

IMO, используя extern, не обязательно «портят» ориентацию объекта. Даже в OO часто используются переменные, доступные из любого места. Использование extern является наиболее частым обходным решением для отсутствия «переменных класса» (например, объявленных с помощью static в Java) в Objective-C. Он позволяет расширить область, в которой вы можете ссылаться на символ за пределами единицы компиляции, где он объявлен, по существу, пообещав, что он будет где-то кем-то определен.

Вы также можете комбинировать extern с __attribute__((visibility("hidden"))), чтобы создать символ, который можно использовать вне его модуля компиляции, но не вне его узла связи, так сказать. Я использовал это для пользовательской библиотеки и кода структуры, чтобы правильно инкапсулировать внутренние детали более высокого уровня.

+0

Hm .. Но это уменьшает читаемость кода, если использование в документах не документировано в большей степени. –

+0

Есть ли способ использовать это с объявлением класса? (т. е. http://stackoverflow.com/questions/22798660/extern-with-class-in-objective-c) – Senseful

+0

Также рассмотрите FOUNDATION_EXPORT, поскольку он также работает с кодом C++. http://stackoverflow.com/a/10953284/142358 –

10

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

15

Есть несколько вариантов использования ключевого слова extern в Objective-C.
Aaron Hillegass предлагает создать глобальные имена уведомлений extern. например:

extern NSString* const XYYourNotification; 

Затем определяют фактический NSString* в вашей реализации

+0

Где я могу найти дополнительную информацию о предложениях Hillegass? Вы знаете URL-адрес? – Joshua

+1

Я впервые увидел его в «Программирование какао для Mac OS X» (Aaron Hillegass). Одна из лучших книг, связанных с какао, которую я читал до сих пор. http://www.bignerdranch.com/book/cocoa®_programming_for_mac®_os_x_3rd_edition –

+0

Зачем мне использовать extern? Могу я просто объявить статическую переменную? Спасибо – aneuryzm

2

В зависимости от вашей потребности, например, у вас есть страница входа в систему. После входа в систему вы сообщаете на другие страницы приложений.

#import <Foundation/Foundation.h> 

extern NSString *const DidLoginNotification; 

@interface LoginViewController : NSObject 
- (void)login; 
@end 


// LoginViewController.m 
#import "LoginViewController.h" 

//define extern const in implementation file only once for the whole process 
NSString *const DidLoginNotification = 
    @"DidLoginNotificationNotified"; 

@implementation LoginViewController 

- (void)login { 
    // Perform notification 
    [[NSNotificationCenter defaultCenter]; 
    sendNotificationName: DidLoginNotification 
                    object:nil]; 
} 

Получающая уведомление сторона не должна знать значение const.

Смежные вопросы