I'm new to Objective-C, but I am curious about something that I haven't really seen addressed anywhere else.
Could anyone tell me what is the difference between a private variable that is declared at the @interface
block versus a variable that is declared within the @implementation
block outside of the class methods, i.e:
@interface Someclass : NSObject { NSString *forExample; } @end
vs.
@implementation Someclass NSString *anotherExample; -(void)methodsAndSuch {} @end
It seems both variables ( forExample
, anotherExample
) are equally accessible throughout the class and I can't really find a difference in their behaviour. Is the second form also called an instance variable?
No you can not declare variable in interface. No, we can't declare variables, constructors, properties, and methods in the interface.
4. What type of variable can be defined in an interface? Explanation: variable defined in an interface is implicitly final and static. They are usually written in capital letters.
No you cannot have non-static variables in an interface. By default, All the members (methods and fields) of an interface are public. All the methods in an interface are public and abstract (except static and default).
In Java, an interface is an abstract type that contains a collection of methods and constant variables.
The latter is not defining an instance variable. Rather, it is defining a global variable in the .m file. Such a variable is not unique to or part of any object instance.
Such globals have their uses (roughly equivalent C++ static members; e.g. storing a singleton instance), but normally you would define them at the top of the file before the @implementation directive.
They're very different! The one in @implementation
is a global variable not unique to each instance. Imagine there were accessors for both variables, written in the obvious way. Then the difference in behavior is shown here:
Someclass* firstObject = [[Someclass alloc] init]; Someclass* secondObject = [[Someclass alloc] init]; //forExample is an instance variable, and is unique to each instance. [firstObject setForExample:@"One"]; [secondObject setForExample:@"Two"]; NSLog(@"%@",[firstObject forExample]); //Result: "One" NSLog(@"%@",[secondObject forExample]); //Result: "Two" //anotherExample is a global variable, and is NOT unique to each instance. [firstObject setAnotherExample:@"One"]; [secondObject setAnotherExample:@"Two"]; NSLog(@"%@",[firstObject anotherExample]); //Result: "Two" (!) NSLog(@"%@",[secondObject anotherExample]); //Result: "Two" //Both instances return "Two" because there is only ONE variable this time. //When secondObject set it, it replaced the value that firstObject set.
If you are looking for this sort of behavior, you might be better off using a class variable, like this:
static NSString* yetAnotherExample = nil;
Then you can use class methods to interact with the variable, and it's clearly class-specific (as opposed to instance-specific or global).
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With