2015-05-01 6 views
-1

Я хочу создать приватную глобальную переменную в классе NSObject. Вот то, что я до сих пор:Как создать приватную глобальную переменную в классе 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 и viewDidLoad?

Update

Я пытаюсь добавить объекты в массив, и использовать его на протяжении всего моего класса NSObject. Вместо того чтобы создавать его в любом методе, который я использую его в

. Пример:

NSArray *myArray = [[NSArray alloc] initWithObjects: @"One", @"Two", nil]; 

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

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

Update 2

При создании нового файла с подклассом NSObject, то .m файл не поставляется с @interface myObjectClass() ... @end. Поэтому я не знаю, где создавать мои переменные, к которым я хочу получить доступ в файле myObjectClass.m.

+0

Вы используете термин «частная глобальная переменная», но «глобальный» имеет очень специфическое значение, о котором я вывел вас, на самом деле не имел в виду. Кроме того, ваш оригинальный пример - одноэлементный, но я предполагаю, что вы действительно не спрашиваете о одиночных играх, а скорее о классах вообще. Это верно? – Rob

+0

@ Хадсон, я думаю, сначала изучите некоторые основные, а затем пришли со стандартной проблемой, все будут рады помочь! как в моем ответе я определил все! – Buntylm

ответ

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 

В нижней строке расширение класса не может быть автоматически добавлено для вас, но вы можете добавить его самостоятельно.

+0

Большое спасибо !!! Вы объяснили все действительно хорошо! У меня только один вопрос. Когда я вызываю 'firstMethod' в другом классе, делайте так:« [[MyClass sharedInstance] firstMethod] '" Или вот так: "[[MyClass init] firstMethod]' "? (Примечание: 'sharedInstance' или' init') – Hudson

+0

@Hudson Пример 'MyClass' был синглом (т. Е. Объектом, для которого есть один и только один экземпляр, который вы можете использовать в любом месте), что означает, что вы, вероятно, хотели' [[ MyClass sharedInstance] firstMethod] '. '[MyClass init] firstMethod]' создаст новый экземпляр, что маловероятно для вас. Но я бы отступил и спросил, что это за класс «MyClass». Должен ли он быть синглом вообще? Синглтон - это специальный инструмент, используемый в особых случаях (и имеет ограничения и проблемы), поэтому используйте их экономно, но там, где они вам нужны, всегда используется шаблон «sharedInstance». – Rob

+0

Если я [[MyClass sharedInstance] firstMethod], будут ли 'myArray' иметь свои объекты? (Будет ли у моего массива '@" один ", @" two "') – Hudson

0

для этого вы определяете MyClass объект вне сторона sharedInstance способ.

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

       return sharedInstance; 
} 

---------- --------- Edited

Вариант 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

+0

Но как я могу создать 'NSArray'? – Hudson

+0

Здесь я редактирую ответ. –

+0

Это в файле .h или .m? – Hudson

0

Я думаю, что это то, что вы хотите реализовать с NSObject класса.

Любое беспокойство теплый прием

enter image description here

enter image description here

enter image description here

+0

В качестве примера я привел класс 'ViewController'. Я не хочу получать доступ к объектам оттуда. Я хочу объявить, назначить и использовать 'array' в классе' NSObject.m' – Hudson

+0

yes, так как у меня также есть класс 'NSObject', где я могу получить доступ к' privateObject' только с классом – Buntylm

+0

Какой метод эквивалентен в 'viewDidLoad' в классе' NSObject'? – Hudson

Смежные вопросы