self.variable и переменное различие [дубликат]

const buf = Buffer.from([0x12, 0x34, 0x56, 0x78]) // 0x12345678 = 305419896

console.log(buf.readUInt32BE(0)) // 305419896
5
задан jscs 9 July 2014 в 23:01
поделиться

5 ответов

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

self.myVariable = obj;

[self setMyVariable:obj];

objc_msgSend(self, @selector(setMyVariable:), obj);

Конечно, это означает, что использование точечного синтаксиса на самом деле приводит к полному сообщению, отправляют, означая вызывание новой функции и всех издержек, которые связаны с ним. Напротив, с помощью простого присвоения (myVariable = obj;) не подвергается ни одним из этих издержек, но конечно они могут только использоваться в методах экземпляра рассматриваемого класса.

14
ответ дан 18 December 2019 в 05:21
поделиться

@synthesize директива говорит компилятору генерировать средства доступа для Ваших членских переменных, согласно спецификациям, данным в @property директиве в Вашем.h файле. (Т.е. если Вы указываете, сохраняют, метод set сохранит переменную, и если Вы укажете копию, то это скопирует его.)

Средства доступа будут (если Вы не укажете иначе) быть названным propertyName и setPropertyName.

Используя. в нотации (примечание, не сам синтаксис как указано выше) говорится, что Вы хотите использовать средства доступа (хорошая вещь, если Вы устанавливаете строки и хотите удостовериться, что сохранить количество корректно, например).

Так, в рамках Вашей реализации класса:

  • self.bill = fred назовет средство доступа setBill.
  • счет = fred установит счет на fred непосредственно, не проходя средство доступа.
13
ответ дан 18 December 2019 в 05:21
поделиться

Одно из различий, которые я узнал при запуске разработки Какао, - то, если я установил переменную для использования @Property / Синтезируют синтаксис, и я не использовал self.myVariable = obj или [сам setMyVariable:obj], но вместо этого myVariable = obj, объект не сохраняется, если obj выпущен позже. (Принимающий @Property был настроен для использования, сохраняют.)

Причиной является сохранить количество, не установлен при использовании myVariable = obj и когда obj выпущен, количество является теперь нулем. (Если Вы не сохраните его сами), Но при помощи средства доступа это сделает сохранить счет для Вас. (Снова принятие Вас настроило его для использования, сохраняют, когда это было объявлено).

5
ответ дан 18 December 2019 в 05:21
поделиться

self синтаксис использует метод доступа, другой синтаксис не делает. Это могло бы быть большой разницей, если средство доступа делает что-то большее чем просто присваивает новое значение. Посмотрите Заявленную часть Свойств учебного руководства Objective C.

2
ответ дан 18 December 2019 в 05:21
поделиться

Другие ответы корректны, различие - то, что запись через точку заставляет ivar быть измененным через аксессуар, а не непосредственно.

Пока Вы не знаете то, что Вы делаете, я рекомендую использовать запись через точку (т.е. self.propertyName = ...). Cocoa/Obj-C делает много с кодированием значения ключа, и в то время как телефонный SDK не в полной мере пользуется тем (с вещами как привязка), в конечном счете это будет. Привыкание к использованию средств доступа теперь сохранит Вас много головных болей в будущем.

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

2
ответ дан 18 December 2019 в 05:21
поделиться