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

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

myObject.property = YES;

или

[myObject setProperty:YES];

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

Ответы [ 5 ]

19 голосов
/ 30 августа 2008

Точечная запись для доступа к свойству в 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) { /* ... */ }

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

4 голосов
/ 15 сентября 2008

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

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

@ свойство (неатомное, сохранение) NSString * myProp;

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

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

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

4 голосов
/ 29 августа 2008

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

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

0 голосов
/ 17 сентября 2008

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

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

Там автор сравнивает скорость нестандартного доступа и точечные обозначения для NSManagedObject и не находит различий. Однако доступ к KVC (setValue: forKey :) кажется примерно в два раза медленнее.

0 голосов
/ 29 августа 2008

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

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

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