Is there any reason to declare a private ivar in @interface instead of @implementation?
I see code like this all over the internet (including documentation provided by Apple):
Foo.h
@interface Foo : NSObject {
@private
id _foo;
}
@end
Foo.m
@implementation Foo
// do something with _foo
@end
The header file defines the public interface of a class, whereas a private ivar is… well… private. So why not declare it like this?
Foo.h
@interface Foo : NSObject
@end
Foo.m
@implementation Foo {
@private
id _foo;
}
// do something with _foo
@end
Declaring instance variables in the
@implementationis a recent feature of Obj-C, this is why you see a lot of code with them in the@interface– there was no other choice.If you are using a compiler which supports declaring instance variables in the implementation declaring them there is probably the best default – only put them in the interface if they need to be accessed by others.
Edit: Additional Info
Instance variables declared in the implementation are implicitly hidden (effectively private) and the visibility cannot be changed –
@public,@protectedand@privatedo not produce compiler errors (with the current Clang at least) but are ignored.