On 12/29/11 6:07 PM, Peter Teeson wrote: > The declaration in the Interface .h file, generated by making the Outlet > connection. is: > @property (weak) IBOutlet NSTextField *textField; > To me that @property statement gives the explicit name textField. > The generated @synthesize statement in the Implementation file is the one > that assigns _textField isn't it? > > I understand that I could have used _textField. In fact in my research I > tried it and it worked. > Similarly for the other iVars window/_window and mute/_mute. > Doing the digging is what led to me conclude there is some general rule which > I do not yet know. > > I understand there is a special meaning for vars beginning with under bar but > I still have to refresh my memory on > Obj-C 2.0. > > So I repeat my question; can someone please explain why I had to use > self.textfield?
"textField" is the name of the *property*. "_textField" is the name of the (private) *instance variable* (ivar) that is backing the property. This might be a little less confusing if the names weren't so similar. Consider analogously: @property (weak) IBOutlet NSTextField *phoneNumberField; @synthesize phoneNumberField = internalRepresentationOfPhoneNumberField; In this case, you would have a *property* called "phoneNumberField" that you might, for example, connect in Interface Builder to a field holding a phone number. You would have an *ivar* called "internalRepresentationOfPhoneNumberField" that stores the actual (pointer to) the property. You could then access the property with: self.phoneNumberField or [self phoneNumberField] What @synthesize is doing is, for all practical purposes, creating a -(NSTextField *)phoneNumberField method that you call to access the property of that name. You could access the ivar directly with internalRepresentationOfPhoneNumberField. What the combination of @property and @synthesize is doing is, roughly, equivalent to manually writing: @interface MyClass : NSView { @private __weak NSTextField *internalRepresentationOfPhoneNumberField; } - (NSTextField *)phoneNumberField; - (void)setPhoneNumberField:(NSTextField *)newtextField; @end @implementation MyClass - (NSTextField *)phoneNumberField { return internalRepresentationOfPhoneNumberField; } - (void)setPhoneNumberField:(NSTextField *)newTextField { internalRepresentationOfPhoneNumberField = newTextField; } @end (Typed in mail, and omitting the IBOutlet semantics.) You should be able to see from this expanded example why you would then need to use either "[self phoneNumberField]" OR "internalRepresentationOfPhoneNumberField". Does that help at all? Why does this matter? In part because properties do not actually need to be backed by ivars. For example, you might have a class that manages student performance and has an interface that hypothetically looks like: @interface ExamCollection : NSObject { } - (void)addExam:(Exam *)anExam; - (void)removeExam:(Exam *)anExam; @property (readonly) NSNumber *averageExamScore; @end @implementation ExamCollection ... - (NSNumber *)averageExamScore { // Loop over exams and return the computed average } @end (A real world example of a readwrite property that is not backed by an ivar is UIView's frame on iOS, but that makes for a more complicated discussion... read up on it if interested. :-) -- Conrad Shultz Synthetiq Solutions www.synthetiqsolutions.com _______________________________________________ Cocoa-dev mailing list (Cocoa-dev@lists.apple.com) Please do not post admin requests or moderator comments to the list. Contact the moderators at cocoa-dev-admins(at)lists.apple.com Help/Unsubscribe/Update your Subscription: http://lists.apple.com/mailman/options/cocoa-dev/archive%40mail-archive.com This email sent to arch...@mail-archive.com