Свойства Objective-C - использует [self myProperty] или self.myProperty медленнее, чем myProperty? - PullRequest
4 голосов
/ 15 июля 2011

Я использую свойства Objective C для обработки сохранения / освобождения переменных экземпляра для меня. В моем классе я делаю такие вещи:

self.myProperty = somethingIWantToRetain
[self.myProperty doSomeAction]
[self.myProperty doSomethingElse]

Использование [self myProperty] / self.myProperty медленнее, чем просто использование myProperty для тех строк, где я не изменяю значение myProperty? Например, будет ли следующее быстрее?

self.myProperty = somethingIWantToRetain
[myProperty doSomeAction]
[myProperty doSomethingElse]

Спасибо

Ответы [ 5 ]

5 голосов
/ 15 июля 2011

Это почти наверняка немного медленнее, но вряд ли это будет иметь большое значение.

Обращение к вашему ивару напрямую (с голым myProperty) напрямую обращается к переменной.Обращаясь к получателю вашей собственности (с эквивалентными self.myProperty или [self myProperty]), необходимо вызвать метод, который обычно выполняет retain и autorelease для вашего ивара.

Однако отправка метода вObjective-C очень, очень быстрый, и вызовы retain / autorelease также довольно дешевы, особенно для объектов, которые, вероятно, не будут уничтожены при очистке пула autorelease.Я бы сосредоточился на удобочитаемости и непротиворечивом стиле и беспокоился о производительности здесь, только когда стало ясно, что у вас есть узкие места в производительности, за которыми нужно охотиться.

4 голосов
/ 15 июля 2011

Если быть точным, когда вы пишете [myProperty doSomeAction], вы фактически не обращаетесь к свойству, а обращаетесь непосредственно к переменной экземпляра (используемой в качестве вспомогательной переменной свойства).

Вы получаете доступ только к свойству(через его установщик и получатель) с точечной нотацией [self.myProperty doSomeAction] (или путем явного вызова установщика / получателя, например, [[self myProperty] doSomeAction], который является точным эквивалентом, поскольку это то, что компилятор переводит при компиляции вашего кода)

Таким образом, когда вы пишете [myProperty doSomeAction], так как он обращается к переменной напрямую - в отличие от [self.myProperty doSomeAction], который вызывает метод получения myProperty, тем самым делая дополнительный вызов метода / отправку сообщения - тогда да, в теории это будет быстрее, чемвы получите одну отправку сообщения.

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


Более того, если вы используете Modern Runtime (что имеет место, если вы пишете код дляВ любой версии iOS, Legacy Runtime используется только в 32-битном Mac OSX), тогда явное определение вспомогательной переменной для свойства больше не требуется.Таким образом, вы можете объявить @property в .h и @synthesize в .m без какой-либо переменной экземпляра (компилятор сгенерирует его для вас во время компиляции), и в таком случае вы не сможете вызвать(несуществующая) переменная экземпляра!(по крайней мере, до директивы @synthesize)

2 голосов
/ 15 июля 2011

Медленнее, чем на еще один шаг в работе? Да. Медленнее, чем заметно или реально медленнее? Абсолютно нет.

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

Это хорошая привычка использовать геттеры вместо прямого доступа к ивару, поэтому я не буду пытаться «ускорить процесс», игнорируя их.

2 голосов
/ 15 июля 2011

Использование точечного синтаксиса Objective-C 2.0 эквивалентно вызову метода получения, поэтому первый фрагмент будет медленнее, если будет произведено две дополнительные динамические отправки.

При этом потеря будетбыть незначительным, и, очевидно, вы получите гибкость, когда сможете изменить установщик и получатель позднее (например, если вы в конечном итоге сделаете это значение неявным, так как оно технически не сохраняется в памяти, или передадите его третьему лицу).объект или выполнение чего-либо асинхронного для хранения, что может потребовать от вас блокирования на получателе в некоторых случаях).

1 голос
/ 15 июля 2011

Да, это будет незначительно быстрее, но вряд ли вы заметно улучшите производительность, выполнив такую ​​микрооптимизацию. Если вы используете self.myProperty, позже вы можете решить реализовать другой метод доступа без необходимости везде менять код.

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