Цел-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
потвърдих, че е глобална променлива, вие сме прави. Изненадан съм, че компилаторът не издава предупреждение при деклариране на нестатична променлива inside @implementation - person Johannes Rudolph; 16.10.2009
comment
предупреждавам те за какво? Деклариране на стандартна глобална променлива? - person ; 16.10.2009
comment
Не можете да ги декларирате в отделен интерфейсен блок. Само оригиналният клас @interface блок може да декларира променливи на екземпляр. Мисля, че можете да създадете разширение на клас или категория, за да декларирате само допълнителни методи. - person Barry Wark; 17.10.2009

Бих казал, че въпреки че може да ви се "почувства" грешно да поставите частни променливи на екземпляр в уж публична заглавка, аз не бих се тревожил за това.

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

Тъй като Apple е добре с това, не мисля, че има за какво да се притеснявате. =)

FYI: Всички променливи на екземпляра са защитени по подразбиране.

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