2012-06-25 4 views
11

Я знаю, что он поддерживает автоматические переменные, но как насчет переменных класса?Поддерживает ли переменные класса Objective-C?

+0

Возможный дубликат [Статическая переменная строки в Objective C на iphone] (http://stackoverflow.com/questions/980083/static-string-variable-in-objective-c-on-iphone) –

+0

http : //stackoverflow.com/questions/1063229/objective-c-static-class-level-variables –

ответ

23

Язык не поддерживает переменные класса. Вы реализуете состояние класса с глобальными переменными static в единицах компиляции реализации.

В заголовке (.h файл):

@interface MyClass : NSObject 
+(int)val; 
@end 

В реализации (файл .m):

static int val = 123; 

@implementation MyClass 
+(int)val {return val;} 
@end 

Использование:

if ([MyClass val] > 100) ... 
+0

Этот язык необходимо уничтожить) – user924

+0

@ user924 На всех практических целей язык уже мертв. [Вы пропустили заметку?] (Https://developer.apple.com/swift /) – dasblinkenlight

+0

Я знаю, но мне нужно использовать OpenCV, и здесь мы снова используем Objective-C – user924

4

переменные класса ObjC просты старые статические переменные.

Foo.m:

static int foo = 0; 

В качестве альтернативы, вы можете использовать C++ анонимное пространство имен, если вы используете ObjC++:

Foo.mm:

namespace { 
    int foo = 0; 
} 

Но есть еще один шаблон, если вы хотите воспользоваться от преимуществ свойств:

Foo.h:

@interface FooShared 

@property (atomic, readwrite, strong) Foo* foo; 

@end 

@interface Foo 

+ (FooShared*) shared; 

@end 

Foo.m:

@implementation FooShared 
@end 

static fooShared* = nil; 

@implementation Foo 

+ (FooShared*) shared 
{ 
    if (fooShared == nil) fooShared = [FooShared new]; 

    return fooShared; 
} 

@end 

somewhere.m:

Foo* foo …; 
foo.shared.foo = …; 

Это может выглядеть немного излишним, но это интересное решение. Вы используете те же конструкции и языковые функции как для свойств экземпляра, так и для свойств класса. Атомация по требованию, аксессоры при необходимости, отладка, точки останова ... Наследование даже.

Творческие умы могут найти другие способы сделать все это, я полагаю. :) Но вы в значительной степени охвачены этими вариантами.

0
@property (class, nonatomic, copy) NSString *someStringProperty; 

Но вы должны обеспечить геттер и сеттер

Из примечания к выпуску Xcode 8: Objective-C поддерживает свойство класса, которые взаимодействуют со свойствами Swift типа. Они объявляются как: @property (класс) NSString * someStringProperty ;. Они никогда не синтезируются. (23891898)