Я знаю, что он поддерживает автоматические переменные, но как насчет переменных класса?Поддерживает ли переменные класса Objective-C?
ответ
Язык не поддерживает переменные класса. Вы реализуете состояние класса с глобальными переменными static
в единицах компиляции реализации.
В заголовке (.h файл):
@interface MyClass : NSObject
+(int)val;
@end
В реализации (файл .m):
static int val = 123;
@implementation MyClass
+(int)val {return val;}
@end
Использование:
if ([MyClass val] > 100) ...
Этот язык необходимо уничтожить) – user924
@ user924 На всех практических целей язык уже мертв. [Вы пропустили заметку?] (Https://developer.apple.com/swift /) – dasblinkenlight
Я знаю, но мне нужно использовать OpenCV, и здесь мы снова используем Objective-C – user924
переменные класса 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 = …;
Это может выглядеть немного излишним, но это интересное решение. Вы используете те же конструкции и языковые функции как для свойств экземпляра, так и для свойств класса. Атомация по требованию, аксессоры при необходимости, отладка, точки останова ... Наследование даже.
Творческие умы могут найти другие способы сделать все это, я полагаю. :) Но вы в значительной степени охвачены этими вариантами.
@property (class, nonatomic, copy) NSString *someStringProperty;
Но вы должны обеспечить геттер и сеттер
Из примечания к выпуску Xcode 8: Objective-C поддерживает свойство класса, которые взаимодействуют со свойствами Swift типа. Они объявляются как: @property (класс) NSString * someStringProperty ;. Они никогда не синтезируются. (23891898)
Возможный дубликат [Статическая переменная строки в Objective C на iphone] (http://stackoverflow.com/questions/980083/static-string-variable-in-objective-c-on-iphone) –
http : //stackoverflow.com/questions/1063229/objective-c-static-class-level-variables –