Есть ли какие-либо издержки на постоянное использование геттера SELF при установке значений свойств, а не на прямой доступ? - PullRequest
0 голосов
/ 20 апреля 2011

RE: Objective-C - Когда использовать 'self'

Я понимаю, когда SELF действительно требуется 100%, чтобы правильно установить сохраняемое свойство, но есть ли какие-либо издержки на постоянный вызов метода get, вместо прямого доступа даже после того, как вы уже получили сохраненный объект?Является ли программа более эффективной , а не , непрерывно вызывающей ее?

Ваш ViewController содержит много сохраненных подпредставлений (т.е. несколько сохраненных UIViews), которые добавляются к основному основному представлению.Внутри вашего viewDidLoad: есть какие-либо издержки, выполняемые:

[self.mySubViewA setBackgroundColor:[UIColor blueColor]];
[self.mySubViewA setOpaque:NO];
[self.mySubViewA setAlpha:1.0f];

[self.view addSubView:self.mySubViewA];

[self.mySubViewB setMyCustomPropertyInThisView:[UIColor redColor]];
....

вместо:

// no calls to SELF at all (i.e saving time on method get cycle calls and directly
// accessing the properties currently retained at that address.
// Assumption here is that mySubViewA is loaded through NIB and is already alloc'd.
[mySubViewA setBackgroundColor:[UIColor blueColor]];
[mySubViewA setOpaque:NO];
[mySubViewA setAlpha:1.0f];

// Is this faster? since we just instantly assign the UIView @ mySubViewA to the main view
// as opposed to a method get cycle?
[self.view addSubView:mySubViewA];

[mySubViewB setMyCustomPropertyInThisView:[UIColor redColor]];
....

Ответы [ 2 ]

1 голос
/ 20 апреля 2011

Да, конечно, есть накладные расходы. Использование self.… означает другой вызов метода, который занимает больше времени, чем простое присваивание. Насколько больше, зависит от того, как реализован геттер (например, если свойство nonatomic или нет).

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

0 голосов
/ 20 апреля 2011
[ self.foo bar ];

эквивалентно 2 вызовам метода:

temp = [ self foo_Getter ];    // first method call
[ temp bar ];                  // second method call

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

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

...