Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Class variable defined at @implementation rather than @interface?

Tags:

objective-c

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?

like image 667
bitcruncher Avatar asked Apr 03 '10 14:04

bitcruncher


People also ask

Can we define variable in interface?

No you can not declare variable in interface. No, we can't declare variables, constructors, properties, and methods in the interface.

What type of variable should be defined in an 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.

Can we declare static variable in interface?

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).

CAN interface have variables in Java?

In Java, an interface is an abstract type that contains a collection of methods and constant variables.


2 Answers

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.

like image 110
Nick Moore Avatar answered Oct 06 '22 07:10

Nick Moore


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).

like image 26
andyvn22 Avatar answered Oct 06 '22 09:10

andyvn22