2010-11-03 2 views
3

Я понимаю, что при доступе к методам setter/getter для свойств я должен использовать [self setThisValue:@"a"];, а не thisValue = @"a";. Однако в приведенном ниже примере я вижу, что добавление собственных документов, которые я отправляю сообщение в свойство iVar, а не в локальную область переменной , но делает ли он что-нибудь еще в этом случае?iVar недвижимость, доступ через self?

@interface CustomController : UIViewController { 
    NSMutableArray *foundList; 
} 
@property(nonatomic, retain) NSMutableArray *foundList; 
@end 

.

[[self foundList] addObject:eachObject]; // I usually write this ... 

ИЛИ

[foundList addObject:eachObject]; 

Гэри.

ответ

4

Если у вас есть определенное свойство для ivar, вы должны использовать его, а не напрямую обращаться к ivar. Это позволяет подклассам переопределять setter/getter и делать что-то другое, чтобы просто извлечь значение из ivar.

Исключение составляет только метод init и dealloc.

+0

Спасибо за ответ, хм, это интересно, я всегда пишу пользовательские подписи для таких объектов, как initWithSize: (int) newSize и внутри реализации I использовать [self setSize: newSize]; это не хорошая практика? ... – fuzzygoat

+0

Iit нет * рекомендация * практика. Проблема заключается в том, что подкласс может иметь переопределенный setSize: и этот метод может зависеть от завершения инициализации подкласса. – JeremyP

2

Использование

[[self foundArray] addObject:eachObject]; 

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

1

Метод доступа очень удобен, если вы когда-либо выполняли подкласс или другие использовали его повторно, и они хотят переопределить вашу функциональность.

0

Использование self.ivar также есть некоторые проблемы с очисткой памяти. особенно вы сохраняете собственность, принадлежащую другому классу. Затем вы получаете новый объект и хотите изменить ссылку на self.ivar = newObject. если вы не используете self.ivar, у него может быть плохой доступ, когда newObject также принадлежит другим. Установитель по умолчанию, проверяет ссылку, если не нуль, выдает старое значение и устанавливает новое ivar в новое значение. Я использовал без объекта без себя сегодня и попал в эту проблему. Короче говоря, если объект является общим, используйте self.ivar ...

Смежные вопросы