2012-06-25 32 views
11

Wiem, że obsługuje zmienne automatyczne, ale co ze zmiennymi klasy?Czy Objective-C obsługuje zmienne klasy?

+0

możliwy duplikat [zmiennej statycznej w Celu C na iphone] (http://stackoverflow.com/questions/980083/static-string-variable-in-objective-c-onhone) –

+0

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

Odpowiedz

23

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) ... 
+0

ten język musi zostać zniszczony) – user924

+0

@ user924 Ze wszystkich praktycznych zastosowań język jest już martwy. [Czy tęskniłeś za notatką?] (Https://developer.apple.com/swift /) – dasblinkenlight

+0

Wiem, ale muszę użyć OpenCV, i tutaj ponownie używamy Objective-C – user924

4

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.

0
@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)