Objective-C нүкте операторымен алдын ала/кейінгі қадамды/азайтуды араластыру керек пе?

Скалярлық меншік түрімен сынып бармын дейді:

@property (nonatomic, assign) int myInt;

Және түсінікті болу үшін келесідей синтезделеді:

@synthesize myInt = _myInt;

Егер біреу маған келесі сызықтың жұмыс жасайтынын сұраса:

self.myInt++;

Мен «жоқ» деп едім. Негіздеме, біз нүктелік оператордың компилятор арқылы алынған гетер әдісін шақыруға арналған синтаксистік қант екенін білеміз. Сондықтан бұл сызық:

[self myInt]++;

Егер сіз бұл екінші жолды Xcode-ге енгізсеңіз, ол келесі компиляцияны жасамайды: «Readonly» тағайындау «объект-c хабарына рұқсат берілмейді». Бұл мағынаға толы, бұл мен күткен еді. Тіпті егер ол құрастырылған болса, мен оның нәтижесін күтіп едім, иванның копирайтты иығына емес, стаканға шығарады.

Бірақ, self.myInt ++ нұсқауы компиляция жасайды және ол жұмыс істейді. Бұл нүкте операторы _myInt-ге тікелей қатынағандай жұмыс істейді. Өзімнің голлерлерім мен қондырғыларыммен қамтамасыз ету арқылы, гетер мен қондырғы процесінде осы тәртіпте қолданылғанын көріп тұрмын:

[self setMyInt:[self myInt] + 1];

Осылайша, нүкте операторы әдісті шақыру сияқты дәлме-дәлдікке жатады немесе {-, ++, + =, - =} операторларына ерекше назар аударады. нүкте белгісімен пайдаланған кездеobjective-cкомпиляторы? Менobjective-cүшін арнайы ой-пікірлерсіз C тілінің ерекшеліктері туралы әрдайым ойладым. Бұл қарапайым сызықobjective-cнүктелік белгісімен таныс емес адамға өте шатасып жатқанын көрдім.

15

1 жауаптар

Ассемблер шығысына қарап, оның екі _objc_msgSend қоңырауларын жасайтынын көре аласыз.

I'd guess it's more a case of applying the rule that a++ is syntactic sugar for a = a + 1

11
қосылды
Диссамберлердің шығуына қарап, objc_msgSend екеуін де көремін. Сіз сипатты көбейтесіз.
қосылды автор David Dunham, көзі
Префикс операторлары ( ++ self.myInt ) қолданылсын ба?
қосылды автор Ben Leggiero, көзі