如何在NSObject类中创建私有全局变量?

时间:2015-05-01 03:43:56

标签: ios objective-c nsobject

我想在public int getCompletionRate() { return total > 0 ? Math .round(((float) (total - remaining) / (float) total) * 100) : 0; } 类中创建一个私有全局变量。以下是我到目前为止的情况:

NSObject

我想创建并分配可在整个+ (MyClass *)sharedInstance { static MyClass *sharedInstance; static dispatch_once_t once; dispatch_once(&once, ^{ sharedInstance = [[self alloc] init]; }); return sharedInstance; } 文件中访问的NSDictionary

例如:在常规.m课程中,有:

.m UIViewController

然后在@interface MyViewControllerClassName () // Here I would declare private global variables. // Example: @property (strong, nonatomic) NSArray *myArray; @end 我会为其分配一个值,我将能够在整个viewDidLoad文件中访问它。

我的问题是:如何在.m类中创建相同的内容(全局私有变量),该类没有NSObject@interface

更新

我试图在数组中添加对象,并在整个NSObject类中使用它。而不是在我使用它的每种方法中创建它。

示例:

viewDidLoad

更新2

当您创建子类为NSArray *myArray = [[NSArray alloc] initWithObjects: @"One", @"Two", nil]; - (void)firstMethod { NSLog(@"%@", [self.myArray firstObject]); } - (void)secondMethod { NSLog(@"%@", [self.myArray lastObject]); } 的新文件时,NSObject文件不会随.m一起提供。因此,我不知道在@interface myObjectClass () ... @end文件中创建我想要访问的变量的位置。

3 个答案:

答案 0 :(得分:1)

你说:

  

当您创建子类为NSObject的新文件时,.m文件不会随@interface myObjectClass () ... @end一起提供。因此,我不知道在myObjectClass.m文件中创建我想要访问的变量的位置。

这是真的,但没有什么可以阻止你自己添加这个(称为"私人类扩展")。事实上,这正是你应该做的。然后,所有私有类属性都应该进入这个私有类扩展。

请参阅Class Extensions Extend the Internal Implementation

回到您的示例,您可能最终得到MyClass.h中定义的公共接口,如下所示:

@interface MyClass : NSObject

+ (MyClass *)sharedInstance;

- (void)firstMethod;
- (void)secondMethod;

@end

.m文件可能包含一个私有类扩展,它定义了私有属性:

@interface MyClass ()

@property (nonatomic, strong) NSArray *myArray;

@end

@implementation MyClass

+ (MyClass *)sharedInstance {
    static MyClass *sharedInstance;

    static dispatch_once_t once;
    dispatch_once(&once, ^{
        sharedInstance = [[self alloc] init];
    });

    return sharedInstance;
}

- (MyClass *)init {
    self = [super init];
    if (self) {
        self.myArray = @[@"one", @"two"];
    }
    return self;
}

- (void)firstMethod {
    NSLog(@"%@", [self.myArray firstObject]);
}

- (void)secondMethod {
    NSLog(@"%@", [self.myArray lastObject]);
}

@end

从底线开始,可能不会自动为您添加类扩展名,但您可以自行添加。

答案 1 :(得分:0)

为此您定义了MyClass方法的sharedInstance对象。

static MyClass *sharedInstance = nil;  
+ (MyClass *)sharedInstance
{
             static dispatch_once_t once;
             dispatch_once(&once, ^{
                    sharedInstance = [[self alloc] init];
              });

              return sharedInstance;
}

---------- ---------已编辑

选项1 - MyViewControllerClassName.m

    @interface MyViewControllerClassName ()
    {
    @private // << note: protected is the default when declared in this scope.
       NSArray *myArray;
    }
    @end

选项2 - MyViewControllerClassName.h

@interface MyViewControllerClassName : NSObject
{
@private // << note: protected is the default when declared in this scope.
   NSArray * myArray;
}
@end

选项3 - MyViewControllerClassName.m

@implementation MyViewControllerClassName
{
@private // << note: private is the default when declared in this scope.
   NSArray * myArray;
}

@end

更多参考:Class variables explained comparing Objective-C and C++ approaches

答案 2 :(得分:0)

我认为这是您要在NSObject课程中实施的内容。

任何关注的热烈欢迎

enter image description here

enter image description here

enter image description here