«Objective-C» ішінде «@private» дегеніміз не?

Objective-C ішінде @private дегеніміз не?

271
10 мая '09 в 6:58 2009-05-10 06:58 user100051 орнатқан 10 мамыр '09 6:58 2009-05-10 06:58
@ 3 жауаптар

Бұл көрінетін өзгерткіш болып табылады - бұл @private деп мәлімделген айнымалы мәндер тек сол сыныптың даналары арқылы қатынасуға @private білдіреді. Жеке мүшелер еншілес сыныптарға немесе басқа кластарға қол жеткізе алмайды.

Мысалы:

 @interface MyClass : NSObject { @private int someVar; // Can only be accessed by instances of MyClass @public int aPublicVar; // Can be accessed by any object } @end 

Бұдан басқа, түсіндіру үшін әдістер әрдайым «Objective-C» -те қол жетімді. Қосымша ақпарат алу үшін бұл сұрақты көріп тұрса да, әдіс туралы декларацияларды «жасыру» тәсілдері бар.

183
10 мая '09 в 7:07 2009-05-10 07:07 жауап hbw 10 мамыр күні 7: 07-де 2009-05-10 07:07

Htw айтылғандай, бұл көрінетін өзгерткіш. @private ivar (мысалы, айнымалы) тек бір сыныптың данасынан тікелей қатынауға @private білдіреді. Алайда бұл сізге көп нәрсе емес, сондықтан сізге мысал келтірейін. Қарапайымдылық үшін сабақтарға арналған init әдістерін мысал ретінде қолданамыз. Мен қызығушылық туындыларын көрсету үшін кіріктірмелі түсініктеме беремін.

 @interface MyFirstClass : NSObject { @public int publicNumber; @protected // Protected is the default char protectedLetter; @private BOOL privateBool; } @end @implementation MyFirstClass - (id)init { if (self = [super init]) { publicNumber = 3; protectedLetter = 'Q'; privateBool = NO; } return self; } @end 

 @interface MySecondClass : MyFirstClass // Note the inheritance { @private double secondClassCitizen; } @end @implementation MySecondClass - (id)init { if (self = [super init]) { // We can access publicNumber because it public; // ANYONE can access it. publicNumber = 5; // We can access protectedLetter because it protected // and it is declared by a superclass; @protected variables // are available to subclasses. protectedLetter = 'z'; // We can't access privateBool because it private; // only methods of the class that declared privateBool // can use it privateBool = NO; // COMPILER ERROR HERE // We can access secondClassCitizen directly because we // declared it; even though it private, we can get it. secondClassCitizen = 5.2; } return self; } 
border=0
 @interface SomeOtherClass : NSObject { MySecondClass *other; } @end @implementation SomeOtherClass - (id)init { if (self = [super init]) { other = [[MySecondClass alloc] init]; // Neither MyFirstClass nor MySecondClass provided any // accessor methods, so if we're going to access any ivars // we'll have to do it directly, like this: other->publicNumber = 42; // If we try to use direct access on any other ivars, // the compiler won't let us other->protectedLetter = 'M'; // COMPILER ERROR HERE other->privateBool = YES; // COMPILER ERROR HERE other->secondClassCitizen = 1.2; // COMPILER ERROR HERE } return self; } 

Сіздің сұрағыңызға жауап беру үшін, @private кез-келген басқа сыныптың данасына қол жеткізуге тырысады. MyFirstClass екі данасы бір-біріне тікелей қол жеткізе алатынын ескеріңіз; Бағдарламашы бұл класты тікелей бақылауды жүзеге асырғаннан кейін, ол бұл мүмкіндікті ақылмен қолданады деп болжанады.

159
16 мая '09 в 9:14 2009-05-16 09:14 BJ Homer-ге 16 мамырда 9:14 жауап берді 2009-05-16 09:14

Бұл @private данасының айнымалы мәніне қол жеткізе алмайтындығын айтса, бұл дегеніміз не екенін түсіну маңызды. Нақты әңгіме, егер сіз осы айнымалы мәндерді бастапқы кодта қолдануға тырыссаңыз, компилятор сізге қате туралы хабар береді. GCC және Xcode нұсқаларының алдыңғы нұсқаларында қатенің орнына ескерту алды.

Қалай болғанда да, барлық уақытта ставкалар өшірілген. Бұл @private және @private @protected ипараттарға кез келген сыныптың нысаны арқылы кіруге болады. Бұл көру қабілеттілік модификаторы қарапайым кодты визуалды түрлендіргіштің ниетін бұзатын машина кодын жасауға қиынырақ етеді.

Қауіпсіздікті қамтамасыз ету үшін ivar көрінетін өзгерістерге негізделе бермеңіз! Олар ештеңе бермейді. Олар әдетте құрылысшы талаптарының компиляциясы үшін арналған.

13
03 окт. Жауап Джефф Вольски Oct 03 2012-10-03 02:54 '12 at 2:54 2012-10-03 02:54