Подтвердить что ты не робот

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

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

myObject.property = YES;

или

[myObject setProperty:YES];

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

4b9b3361

Ответ 1

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

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

Ответ 2

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

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

Ответ 3

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

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

@property (неатомный, сохраняющий) NSString * myProp;

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

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

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

Ответ 4

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

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

Ответ 5

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

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

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