On Jun 29, 2013, at 7:48 PM, David Duncan <david.dun...@apple.com> wrote:

> On Jun 29, 2013, at 11:18 AM, Matt Neuburg <m...@tidbits.com> wrote:
> 
>> 
>> On Jun 29, 2013, at 10:55 AM, Jens Alfke <j...@mooseyard.com> wrote:
>> 
>>> This is just a parsing issue. If an ivar is declared in a class’s public 
>>> interface, it’s in scope in any method of that class or a subclass. So if a 
>>> subclass declares an ivar with the same name, you now have a conflict and 
>>> the parser won't know which one you’re referring to, so it won’t let you do 
>>> that.
>>> 
>> 
>> That is what I would have thought, but that is exactly what I appear to be 
>> doing. That's what I'm finding so odd.
>> 
>> * MyClass, the superclass, defines "thing" as an int, in public (in its 
>> interface section in its header file).
>> 
>> * MyClass2, the subclass, defines "thing" as an NSString*, in private (in 
>> its implementation section).
>> 
>> I would have expected a conflict. Instead, the compiler seems quite happy, 
>> provided any mention of self->thing in MyClass2 is an NSString.
>> 
>> Of course it's possible that I've just confused the heck out of myself and 
>> my experiment doesn't show what I think it shows. But try it; I think you'll 
>> find that what I'm saying is true. m.
> 
> 
> Think of it like scope. Your class's @implementation defines a more limited 
> scope than the class's @interface or its superclass's @interface. When you 
> add a new ivar in the @implementation block, it hides the ivar from the super 
> class, just as what happens when you define a local variable with the same 
> name as an enclosing scope.
> 
> What can get confusing is that if you type case to the super class you can 
> still access the hidden ivar. In general I would avoid this (as I would avoid 
> declaring ivars in a public interface).

Fascinating, Captain! I really like this "scope" analogy.

In my defence, I was declaring the ivar in the public interface only because I 
wanted to experiment with the subclass's access to the ivar; it can't see the 
ivar at all if it isn't declared in the superclass's public interface (or in a 
mutually imported header file, which is what I usually do in these situations).

I hadn't gotten around to trying the typecasting trick yet. :)))

Thx as usual - m.

--
matt neuburg, phd = m...@tidbits.com, http://www.apeth.net/matt/
pantes anthropoi tou eidenai oregontai phusei
Programming iOS 6! http://shop.oreilly.com/product/0636920029717.do
RubyFrontier! http://www.apeth.com/RubyFrontierDocs/default.html
TidBITS, Mac news and reviews since 1990, http://www.tidbits.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:
https://lists.apple.com/mailman/options/cocoa-dev/archive%40mail-archive.com

This email sent to arch...@mail-archive.com

Reply via email to