Разница в производительности между точечной нотацией в сравнении с методом вызов в Objective-C

StackOverflow https://stackoverflow.com/questions/34674

  •  09-06-2019
  •  | 
  •  

Вопрос

Вы можете использовать стандартную точечную нотацию или метод вызова в Objective-C для доступа к свойству объекта в Objective-C.

myObject.property = YES;

или

[myObject setProperty:YES];

Есть ли разница в производительности (с точки зрения доступа к собственности)? Это просто вопрос предпочтения с точки зрения стиля кодирования?

Это было полезно?

Решение

Dot обозначения для доступа к свойствам в Objective-C является Сообщение отправит, как нотация с кронштейном. То есть, учитывая это:

@interface Foo : NSObject
@property BOOL bar;
@end

Foo *foo = [[Foo alloc] init];
foo.bar = YES;
[foo setBar:YES];

Последние две линии будут составлять точно так же. Единственное, что меняет это, если у собственности есть getter и/или setter атрибут указан; Тем не менее, все, что он делает, это изменяет то, что отправляет сообщение, а не отправляется ли сообщение:

@interface MyView : NSView
@property(getter=isEmpty) BOOL empty;
@end

if ([someView isEmpty]) { /* ... */ }
if (someView.empty) { /* ... */ }

Обе последние две линии будут компилироваться одинаково.

Другие советы

Проверить Статья от какао - моя девушка. Полем Суть этого заключается в том, что нет никакого штрафа за эффективность использования одного над другим.

Тем не менее, нотация действительно затрудняет увидеть, что происходит с вашими переменными и каковы ваши переменные.

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

Таким образом, в основном вы, вероятно, хотите определить собственность, как:

@property (неатомно, сохраняет) nsstring *myprop;

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

Образец, о котором следует знать: если вы сами определяете сеттер (вместо того, чтобы позволить @Synthesize создать его) и начнете иметь другие побочные эффекты от установки значения, вы, вероятно, должны сделать сеттер обычным методом вместо вызова, используя нотацию свойства.

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

Насколько я видел, между ними нет существенной разницы в производительности. Я достаточно уверен, что в большинстве случаев он будет «составлен» до того же кода.

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

Также прочитайте этот пост в блоге о какао с любовью:

http://cocoawithlove.com/2008/06/speed-test-nsmanagedobject-objc-20.html

Там автор сравнивает скорость пользовательских аксессуаров и точечных обозначений для nsmanagedObject и не находит разницу. Тем не менее, доступ к KVC (SetValue: ForKey :) кажется примерно вдвое медленным.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top