я должен всегда использовать self.classvariable? - PullRequest
1 голос
/ 01 декабря 2011

При кодировании моего приложения для iPhone.Всегда ли это хорошая практика при настройке или получении значений для использования себя?Кажется, я забыл половину времени, и недавно я обнаружил ошибку, которая, как мне кажется, связана с этим.

Должен ли я ВСЕГДА использовать self или есть случаи, когда это не нужно или может вызвать проблемы?

Редактировать: Вот пример того, что я делаю в коде

else if([CellIdentifier isEqualToString:@"Linked Item"]) {
        linkedItemLabel = [[UILabel alloc] initWithFrame:CGRectMake(120, 5, 160, 34)];
        linkedItemLabel.adjustsFontSizeToFitWidth = YES;
        linkedItemLabel.textColor = [UIColor blackColor];
        linkedItemLabel.font = [UIFont systemFontOfSize:17.0];
        linkedItemLabel.text = [storedValuesMutableArray objectAtIndex:7];
        linkedItemLabel.backgroundColor = [UIColor clearColor];
        linkedItemLabel.textAlignment = UITextAlignmentRight;
        [cell addSubview:linkedItemLabel];}

Это часть кода, которая устанавливает мои ячейки таблицы для формы, которую нужно заполнить.Должен ли я использовать self.linkedItemLabel или это нормально?

Ответы [ 4 ]

2 голосов
/ 02 декабря 2011

Вы должны понимать, что использование self.property - это вызов метода (метод получения или метода установки), а не простое назначение.

Вы должны использовать ivar непосредственно только внутри тела установки или получения.

Причины:

1 / Свойства призваны оградить вас от ада удержания-освобождения.Давайте представим, что у вас есть свойство "assign", вы используете ivar напрямую, а затем решаете изменить его на "retain".То, что вы получаете, - это ошибка, которую трудно найти.

2 / Сеттеры и геттеры могут выполнять дополнительные функции (например, сеттер может добавлять / удалять наблюдателей к объекту) или вести логирование.Если вы используете ivar напрямую, вы упускаете эту специальную функциональность.

3 / Сеттеры и геттеры могут быть переопределены в подклассе.

В небольших проектах вы, вероятно, можете избежать большинства проблем, даже если выиспользуя ivars напрямую, но в больших проектах, запрограммированных командой, вы должны использовать только self.property, чтобы уменьшить количество ошибок и улучшить сопровождение кода.Также неплохо дать вашему ивару другое имя (например, property_ или _property, потому что вы заметите, когда используете его без self..

Если вы не пишете высокую производительностьигровые или математические алгоритмы, не беспокойтесь о худшей производительности при использовании self.property.

1 голос
/ 01 декабря 2011

Это зависит от случая, если вы просто используете @synthesize для автоматической генерации геттеров, то это не вызовет никаких проблем у геттеров.Хотя обычные методы OO говорят вам использовать encapsulation, вы заметите, что почти все примеры кода Apple обращаются к ivar напрямую.

Другая распространенная практика обращения к ivar без использования self - это синтезировать следующим образом.:

@synthesize myVar=_myVar

и использовать _myVar при обращении к этой переменной.

Это вызвало бы проблему, только если вы внедрили что-то в ваш метод получения вместо использования @synthesize.

Что касается сеттеров, то это не совсем проблема, но вы просто должны иметь в виду, что свойства этого ивара будут применяться только в том случае, если вы используете self.myIvar вместо прямого доступа к iVar, поэтомуНапример, свойство, объявленное как (retain), будет сохранено, только если вы выполните self.myIvar = newValue a s против myIvar = newValue.

0 голосов
/ 01 декабря 2011

Вы должны использовать это с умным и ясным пониманием. Если вы используете так называемый точечный синтаксис (то есть self.myVariable), это означает, что вы вызываете метод получения или установки свойства, который на самом деле является селектором, отправляющим экземпляр объекта, что довольно сложно в Objective-C время выполнения. Итак, если вам нужно только значение вашего var - вы можете вызвать его один раз и повторно использовать сохраненное состояние или напрямую обратиться к i-var (если позволяют разрешения).

Позвоните геттерам / установщикам, когда они вам действительно нужны.

0 голосов
/ 01 декабря 2011

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

Вы должны использовать self, если у вас нет явной причины не делать это.

...