Скажем, это в моем заголовочном файле:
@interface AppDelegate : NSObject <NSApplicationDelegate>
@property (weak) IBOutlet NSSlider *slider;
- (void)doSomething;
@end
…и это *m:
@implementation AppDelegate
- (void) doSomething {[self.slider setFloatValue:0];}
@end
Я новичок в Xcode и Objective C, и я хотел бы использовать и понимать современные «инструменты», представленные Apple в своей документации, а именно ARC, или здесь более конкретно возможность пропустить @synthesize
.
Если я правильно понял, @property (weak) IBOutlet NSSlider *slider;
делает для меня несколько вещей, в том числе:
- создание переменной экземпляра с именем
_slider
; - создание геттера с именем
slider
; - создание сеттера с именем
setSlider
.
Я занимался C++ до сих пор, поэтому я рассматриваю переменные экземпляра как эквивалент того, что я называю (надеюсь, правильно) членами моих классов C++, которые я, кстати, всегда называю _member
.
Я понимаю, что весь смысл инкапсуляции в том, что если вы находитесь за пределами данного класса, вам должно использоваться методы доступа для доступа к этим переменным; они являются вашими приватными, поэтому вы не сможете получить к ним доступ через _member
, даже если попытаетесь.
Но когда я пишу файл *.m своего класса, _member
что-то значит. Возвращаясь к моему примеру, я думаю, что self.slider
и _slider
эквивалентны. Последнее, естественно, приходит на ум в первую очередь, так как сохраняет несколько символов.
Мой вопрос: являются ли эти два абсолютно эквивалентными?
Я знаю, что это похоже на этот вопрос, например, но вот несколько причин, почему я хотел задать себе вопрос:
- Я не использую
@synthesize
, поэтому на самом деле я не тот, кто создает_slider
, и мне интересно, имеет ли это значение (я считаю, что это довольно недавнее улучшение ObjC, и большинство ответов по-прежнему относятся к@synthesize
); - кажется, что в среднем большинство разговоров заканчиваются «так что, просто используйте
self.name
», но я не понимаю, является ли это просто рекомендацией, соглашением о чем-то более важном (влияющем, скажем, на производительность) ; - Точно так же некоторые говорят, что вы должны использовать только
_name
в таких методах, какdealloc
и ему подобных; но я не пишу эти слова благодарности ARC, значит ли это, что я никогда не должен использовать_name
? Если да, то почему?
Я надеюсь, что это оправдывает этот пост, я извиняюсь, если я пропустил ранее существовавший ответ. Заранее спасибо за помощь.
self->_slider
. Кстати, я не предлагаю вам использовать его. - person lucianomarisi   schedule 29.05.2014MyObject->_name
вне реализации классаMyClass
для этого объекта, Xcode скажет мне: «У MyClass нет члена с именем _name». Разве это не переводит тот факт, что вне реализации вы можете получить доступ к этому члену только через свойствоMyObject.name
(или[MyObject name]
)? - person   schedule 30.05.2014