Кажете, че това е в моя заглавен файл:
@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