全局int变量目标c

Cor*_*rey 5 global objective-c

我想在一个类中声明一个静态int变量,并且可以在每个其他类中访问它.做这个的最好方式是什么?

Sev*_*yev 9

Objective C中没有静态类变量.您可以在类的实现文件中将其创建为文件范围静态变量,并在类中提供静态setter和getter方法.

或者你可以把它变成一个老派全球,并extern在.h文件中声明.前一种方法更灵活 - 您可以在setter方法中添加额外的检查,例如,后者减少输入,并避免方法调用开销.


Dur*_*n.H 5

以下是您可以尝试的一些方法

  • 在appdelegate中声明全局变量

  • 创建一个单例类并将全局变量放在那里.


使用appdelegate

appdelegate也是一种单身类

功能定义:

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

功能调用:

[self ReadAppDelegateInstanceVariable:@"someInstanceVariableName"];
Run Code Online (Sandbox Code Playgroud)

使用你自己的单例类

只能存在一个类实例.

单例声明示例:

@interface SigletonClass : NSObject
{
  //declare instance variable
}
+ (id)sharedSingletonClass;
@end
Run Code Online (Sandbox Code Playgroud)

单例实现示例:

方法1:使用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
Run Code Online (Sandbox Code Playgroud)

方法2:不使用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
Run Code Online (Sandbox Code Playgroud)

功能定义:

-(NSString*)ReadSingleTonInstanceVariable:(NSString*)InstVar 
{
   SigletonClass sObj=[SigletonClass sharedSingletonClass];
   return [sObj valueForKey:InstVar];
}
Run Code Online (Sandbox Code Playgroud)

功能调用:

[self ReadSingleTonInstanceVariable:@"SomeInstanceVariableName"];
Run Code Online (Sandbox Code Playgroud)

NSString到int:

-(int)ConvertToIntFromString:(NSString*)str
{
    return str.intValue;
}
Run Code Online (Sandbox Code Playgroud)

据我所知,没有任何性能问题,可以单独使用另一种方式.

我总是喜欢单独的类而不是appdelegate,因为代码将是无杂乱的,我认为过度使用appdelegate作为臭代码.