Re: Understanding the "declaration of instance variables in the interface is deprecated" warning.
Re: Understanding the "declaration of instance variables in the interface is deprecated" warning.
- Subject: Re: Understanding the "declaration of instance variables in the interface is deprecated" warning.
- From: Alex Zavatone <email@hidden>
- Date: Wed, 03 Jun 2015 11:23:37 -0400
On Jun 3, 2015, at 11:15 AM, Mark Wright wrote:
> Sorry, yes, I misread the initial paragraph that mentions the @implementation block. I actually meant implementation *file* since that’s typically where the class extension @interface is declared (it extends the class internally).
>
> However, as you’ve surmised, all this talk of clang warnings regarding this is directly related to the primary *class interface* which is typically declared in the header file. This is the class interface:
>
> @interface SubClass : ParentClass
> ….
> @end
>
> The idea is to end the old ways of declaring ivars in the header and move them into the implementation where they belong (they’re private to the class).
This has been absolutely great.
By being able to spell out EXACTLY how and why to implement ivars (if they must), I've been able to create a simple project for my team that shows where they are supported, where they aren't supported, what the difference is and have comments that state "simply use properties instead and access the autocreated _ivar from autosynthesized @properties".
It would be nice to have them NOT add to the 218+ warnings we already have because of our ivar mess and now I have the sample for them to learn from.
Super awesome.
Thanks, David and Mark.
- Alex Zavatone
>
>
>
>> On 03 Jun 2015, at 16:02, Alex Zavatone <email@hidden> wrote:
>>
>>
>> On Jun 3, 2015, at 10:41 AM, David Duncan wrote:
>>
>>> There are 3 ways to add ivars to a class. The traditional way:
>>>
>>> @interface Foo {
>>> id _bar;
>>> }
>>>
>>> And 2 new ways:
>>>
>>> @interface Foo() { // Class extension, note the ()
>>> id _baz;
>>> }
>>
>> Ahhhhhhh. Completely missed that. Haven't seen it explained that clearly in a morning of surfing.
>>
>> So, running a quick test using the clang pragma for -Wobjc-interface-ivars, in both the .h and .m files of a class this clarifies the Apple and Clang documentation quite a bit.
>>
>> In the 3 cases you outlined for declaring iVars, Clang ONLY warns about declaring the ivars within the @interface parens of @interface which is generally within the header file.
>>
>> Both other cases (the two new ways of class extension, @interface stuff() {} and @implementation stuff {} ) do not upset Clang at all.
>>
>> So, generally, the rule comes down to "don't declare ivars within the @interface that is probably within your .h file but if you need to (you should use properties instead), you can within the class extension and @implementation."
>>
>> Does this sound like a proper explanation?
>>
>> Thanks much, David.
>>
>>
>>> @implementation Foo { // Implementation block.
>>> id _faz;
>>> }
>>>
>>
>>
>>>> On Jun 3, 2015, at 7:32 AM, Alex Zavatone <email@hidden> wrote:
>>>>
>>>> Maybe I should have included the text above it.
>>>>
>>>> "It's also possible to use a class extension to add custom instance variables. These are declared inside braces in the class extension interface."
>>>>
>>>> So, I don't know how you see that it goes in the @implementation block since the code I pasted and the line above it say it goes in the @interface.
>>>>
>>>> Page 73 of
>>>> https://developer.apple.com/library/mac/documentation/Cocoa/Conceptual/ProgrammingWithObjectiveC/ProgrammingWithObjectiveC.pdf
>>>>
>>>> On Jun 3, 2015, at 10:22 AM, Mark Wright wrote:
>>>>
>>>>> That’s a ‘Class Extension’. Furthermore, it’s under the title "Class Extensions Extend the Internal Implementation”. It also mentions that it goes in the @implementation block…
>>>>>
>>>>>
>>>>>
>>>>>
>>>>>> On 03 Jun 2015, at 15:11, Alex Zavatone <email@hidden> wrote:
>>>>>>
>>>>>> Apple's Programming with Objective-C reference document © 2014
>>>>>>
>>>>>> https://developer.apple.com/library/mac/documentation/Cocoa/Conceptual/ProgrammingWithObjectiveC/ProgrammingWithObjectiveC.pdf
>>>>>>
>>>>>>
>>>>>> Page 73
>>>>>>
>>>>>> @interface XYZPerson () {
>>>>>> id _someCustomInstanceVariable;
>>>>>> }
>>>>>> ...
>>>>>> @end
>>>>>>
>>>>>> Uhhhhhh.
>>>>>>
>>>>>> Doesn't this violate Clang's own mention that "declaration of instance variables in the interface is deprecated" in Apple's own recommendations and documentation?
>>>>>> _______________________________________________
>>>>>>
>>>>>> Cocoa-dev mailing list (email@hidden)
>>>>>>
>>>>>> 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:
>>>>>>
>>>>>> This email sent to email@hidden
>>>>>
>>>>
>>>> _______________________________________________
>>>>
>>>> Cocoa-dev mailing list (email@hidden)
>>>>
>>>> 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:
>>>>
>>>> This email sent to email@hidden
>>>
>>> --
>>> David Duncan
>>>
>>
>
_______________________________________________
Cocoa-dev mailing list (email@hidden)
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:
This email sent to email@hidden