Objective-C: что является частным, а что нет?

Почему люди используют

@interface ViewController : UIViewController 
{
@private
    UIButton* button_;
}

Объявления @private в публичных заголовках? Объявление переменной внутри реализации дает тот же результат, не так ли? Мне кажется странным, я думал, что публичный заголовок должен содержать только действительно публичные члены. Что делать с защищенными участниками?

@implementation ViewController
    UIButton* button_;
@end

Единственное различие, о котором я знаю, заключается в том, что эта переменная видна только внутри текущего модуля компиляции (файл .m, верно?)

Верно ли то же самое и для методов? Я мог бы хорошо скомпилировать с правильным упорядочиванием методов или предварительными объявлениями. Почему люди хотят объявлять категории для частных методов? Только для тестирования?


person Johannes Rudolph    schedule 16.10.2009    source источник


Ответы (4)


Объявление переменной внутри блока @implementation создаст глобальную переменную, а не переменную экземпляра. Переменные экземпляра необходимо определить как часть @interface.

Хотя вы можете создать дополнительный блок @interface с помощью категории или расширения, но он может содержать только объявления методов, а не переменные экземпляра.

person pgb    schedule 16.10.2009
comment
Я думаю, что это не так, это просто глобальная переменная в C способе объявления вещей. Помните, что Objective-C является строгим надмножеством C, поэтому все C правила по-прежнему применяются. - person pgb; 16.10.2009
comment
Я подтвердил, что это глобальная переменная, мы правы. Я удивлен, что компилятор не выдает предупреждения при объявлении нестатической переменной внутри @implementation - person Johannes Rudolph; 16.10.2009
comment
предупреждая вас о чем? Объявление стандартной глобальной переменной? - person ; 16.10.2009
comment
Вы не можете объявить их в отдельном интерфейсном блоке. Только исходный блок class @interface может объявлять переменные экземпляра. Я думаю, вы можете создать расширение класса или категорию только для объявления дополнительных методов. - person Barry Wark; 17.10.2009

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

Взгляните практически на любой файл заголовка для класса Какао (кроме классов кластера), и вы увидите, что Apple объявляет свои переменные экземпляра в своих общедоступных файлах заголовков.

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

К вашему сведению: все переменные экземпляра защищены по умолчанию.

person Dave DeLong    schedule 16.10.2009

Верно ли то же самое и для методов?

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

Я мог бы хорошо скомпилировать с правильным упорядочиванием методов или предварительными объявлениями. Почему люди хотят объявлять категории для частных методов? Только для тестирования?

Частные категории - это форма предварительного объявления. Вы можете думать о них, как о прототипах C.

Андрей

person adonoho    schedule 16.10.2009

@private относится только к iVars.

По умолчанию вы можете получить доступ к ivars экземпляра следующим образом: - id iShouldNotDoThis = foo->bar;

@private означает, что вы не можете получить доступ к ivar таким образом и должны использовать методы доступа.

id thisIsBetter = [foo bar];

Ничего общего с частными категориями или методами.

person Community    schedule 16.10.2009
comment
я бы не получил ошибку компилятора / компоновщика при попытке доступа к button_, если бы он был объявлен только внутри файла реализации? - person Johannes Rudolph; 16.10.2009
comment
его нет в файле реализации .. он находится в общедоступном заголовке, объявленном @private - person ; 16.10.2009
comment
извините, я имел в виду МОЙ пример aboce, где button_ объявлен в файле реализации - person Johannes Rudolph; 16.10.2009
comment
а, понятно. Первый вариант, который у вас есть, аналогичен описанному выше. Второй вариант совершенно другой, как говорит pgb - глобальная переменная C (это не значит, что она статическая) - person ; 16.10.2009