Использование self в вызове метода - PullRequest
0 голосов
/ 30 ноября 2009

При использовании свойства / синтеза для UITableView, UIButton и т. Д. Должны ли self включаться в вызов метода для этой переменной? Используя UITableView в качестве примера, есть ли разница между [self.myTableView visibleCells] и [myTableView visibleCells]? Или скажи [self.myImage setImage:...] и [myImage setImage:...]?

Я видел код Apple, который использует self (Bubble Level), и примеры в книге «Начало разработки iPhone», в которых не используется self. Я хотел бы понять это лучше, тем более что использование self в моих вызовах методов UIScrollView вызвало ошибочную / ошибочную прокрутку. Спасибо.

Ответы [ 3 ]

2 голосов
/ 01 декабря 2009

Использование self.myTableView - это еще один способ сказать [self myTableView] (оно также может быть [self setMyTableView:...];, если используется в операторе присваивания). Другими словами, вы выполняете метод.

Использование myTableView напрямую обращается к переменной экземпляра.

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

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

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

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

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

Разница сводится к тому, как вы определяете свойство. Например, скажем, у вас есть следующее:

@interface MyObject : NSObject {
   NSObject *memberVariable;
}
@property (nonatomic, retain) NSObject *memberVariable;
@end

@implementation MyObject
    @synthesize memberVariable;
@end

Указание (nonatomic, retain) фактически говорит @synthesize, как создавать методы получения и установки. Указание retain заставляет метод setter вызывать retain для объектов, которые я ему передаю. Итак, self.memberVariable = someOtherObject эквивалентно memberVariable = [someOtherObject retain];

По этой же причине вам никогда не следует делать self.memberVariable = [[NSObject alloc] init];, если вы указали сохранение в определении свойства. alloc инициализирует счет удержания равным 1, передача объекта методу-установщику увеличивает счет удержания до 2.

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