2009-09-05 2 views
5

Что разница между:Objective C - статические члены и постоянные

@interface SomeClass : NSObject { 
    NSObject *something; 
} 

и

@interface SomeClass : NSObject { 

} 
NSObject *something; 

? Кроме того, какая разница между Java final и Objective C (C) const? И где я должен объявлять статические члены класса для следующих ситуаций: 1. Когда нужен только класс ** **. ** Где это было бы свойство, которое могли бы прочитать другие классы? Я уже знаю о #define, но это не хорошо для объектов, потому что каждый раз он создает новые. Благодаря!

ответ

7

Первый экземпляр переменной и создает something для каждого экземпляра SomeClass. Это похоже на C's

typedef struct { 
    NSObject *something; 
} SomeClass; 

Последний объявляет глобальную переменную, которая не имеет реальной связи с SomeClass. В C это эквивалентно

NSObject *something; 

определено в глобальном масштабе. Objective-C на самом деле не имеет переменных класса, поэтому используются глобальные переменные (скорее, иногда используются, переменные с compilation unit и статические storage class - это то, что следует использовать).

Самый чистый способ определения переменной «класс» - определить статическую переменную в файле реализации. Таким образом, только методы класса могут получить к нему доступ, и вы избегаете загрязнения глобального пространства имен. Если вы хотите, чтобы он был общедоступным, укажите аксессоров.

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

2

Что касается вопроса «final vs const», то оба они похожи. Они заявляют, что значение не может измениться. обратите внимание, что в Java, поскольку все значения (кроме примитивов) являются указателями, объект, на который он указывает, может меняться под ним, но местоположение памяти (указатель) никогда не изменится. Я полагаю, что вы ожидаете подобного поведения в Objective C, и всегда полезно не допускать, чтобы элементы, которые изменяются, являются «final» или «const», поскольку значения внутри объекта все равно могут быть изменены.

+0

Обратите внимание, что «final» похож на указатель const («' * const' »), а не указатель на константу (« const * »). Он также очень похож на ссылочные типы C++ (« &' »). – outis

+0

Спасибо за разъяснение, что - я всегда путаю особые случаи :) – aperkins

+0

Если вы считаете, что это сбивает с толку, проверьте: http://www.strainu.ro/programming/c/a-little-fun-with-cdecl/ – outis

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

  • Нет связанных вопросов^_^