Wiem, że obsługuje zmienne automatyczne, ale co ze zmiennymi klasy?Czy Objective-C obsługuje zmienne klasy?
Odpowiedz
Język nie obsługuje zmiennych klas. W jednostkach kompilacji implementacji implementujesz stan specyficzny dla klasy ze zmiennymi globalnymi static
.
W nagłówku (plik .h):
@interface MyClass : NSObject
+(int)val;
@end
w realizacji (plik .m):
static int val = 123;
@implementation MyClass
+(int)val {return val;}
@end
Zastosowanie:
if ([MyClass val] > 100) ...
ten język musi zostać zniszczony) – user924
@ user924 Ze wszystkich praktycznych zastosowań język jest już martwy. [Czy tęskniłeś za notatką?] (Https://developer.apple.com/swift /) – dasblinkenlight
Wiem, ale muszę użyć OpenCV, i tutaj ponownie używamy Objective-C – user924
zmienne klasy objc są gładkie stare zmienne statyczne.
Foo.m
:
static int foo = 0;
Alternatywnie, można użyć nazw C++ anonimowy jeśli używasz objC++:
Foo.mm
:
namespace {
int foo = 0;
}
Ale istnieje inny wzór, jeśli chcesz korzystać z zalet właściwości:
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 = …;
To może wyglądać trochę overkill, ale jest to ciekawe rozwiązanie. Używasz tych samych konstrukcji i funkcji językowych zarówno dla właściwości instancji, jak i właściwości "class". Atomowość na żądanie, akcesory w razie potrzeby, debugowanie, punkty przerwania ... Dziedziczenie nawet.
Twórcze umysły mogą znaleźć inne sposoby robienia tego wszystkiego, jak przypuszczam. :) Ale jesteś prawie pokryty tymi opcjami.
@property (class, nonatomic, copy) NSString *someStringProperty;
Ale trzeba zapewnić getter i setter
Z Xcode 8 Release Notes: Objective-C obsługuje właściwości klasy, które byłyby kompatybilne z właściwościami typu Swift. Są one zadeklarowane jako: @property (klasa) NSString * someStringProperty ;. Nigdy nie są syntetyzowane. (23891898)
możliwy duplikat [zmiennej statycznej w Celu C na iphone] (http://stackoverflow.com/questions/980083/static-string-variable-in-objective-c-onhone) –
http : //stackoverflow.com/questions/1063229/objective-c-static-class-level-variables –