Global int variable objective c

Solution 1:

There are no static class variables in Objective C. You can create it as a file-scope static variable in the class' implementation file and provide static setter and getter methods in the class.

Or you can make it an old-school global, with an extern declaration in the .h file. The former approach is more flexible - you can add extra checks in the setter method, for example, the latter is less typing, and avoids the method call overhead.

Solution 2:

Here are some ways you could try

  • Declaring the global variables in appdelegate

  • Creating a singleton class and putting the global variables there.


Using appdelegate

appdelegate is also a kind of singleton class

Function definition:

-(NSString*)ReadAppDelegateInstanceVariable:(NSString*)InstVar 
{
AppDelegate *appDel=(AppDelegate *)[UIApplication sharedApplication].delegate;
return [appDel valueForKey:InstVar];
}

Function Calling:

[self ReadAppDelegateInstanceVariable:@"someInstanceVariableName"];

Using your own singleton class

Only one instance of class can exist.

Sample singleton declaration:

@interface SigletonClass : NSObject
{
  //declare instance variable
}
+ (id)sharedSingletonClass;
@end

Sample singleton implementation:

Approach 1: Using GCD

@implementation SigletonClass

+ (id)sharedSingletonClass {

    static SigletonClass *sharedClass = nil;

    static dispatch_once_t onceToken;//The way we ensure that it’s only created once is by using the dispatch_once method from Grand Central Dispatch (GCD).

   dispatch_once(&onceToken, ^{
     sharedClass = [[self alloc] init];
  });

    return sharedClass;
}

- (id)init {
    if (self = [super init]) {
     //init instance variable        
    }
    return self;
}
@end

Approach 2: Without using GCD

@implementation SigletonClass

+ (id)sharedSingletonClass {

    static SigletonClass *sharedClass = nil;

    @synchronized(self) {//To safeguard threading issues

        if (sharedClass == nil)
            sharedClass = [[self alloc] init];
    }

    return sharedClass;
}

- (id)init {
    if (self = [super init]) {
     //init instance variable        
    }
    return self;
}
@end

Function definition:

-(NSString*)ReadSingleTonInstanceVariable:(NSString*)InstVar 
{
   SigletonClass sObj=[SigletonClass sharedSingletonClass];
   return [sObj valueForKey:InstVar];
}

Function Calling:

[self ReadSingleTonInstanceVariable:@"SomeInstanceVariableName"];

NSString to int:

-(int)ConvertToIntFromString:(NSString*)str
{
    return str.intValue;
}

As far as I’m aware, there are no performance issues with doing it one way over another.

I always prefer singleton class rather than appdelegate because the code will be clutter free and I consider overusing appdelegate as smelly code.

Solution 3:

That breaks some patterns, I'd not use it.

Anyway, if you declare a property in your app delegate then you can call:
[[NSApp delegate] myVar] anywhere.

How exactly do you intent to use this variable?