2012-06-25 86 views
11

我知道它支持自動變量,但類變量呢?Objective-C是否支持類變量?

+0

[iPhone上的Objective C中的靜態字符串變量]的可能重複(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

Foo.mm

namespace { 
    int foo = 0; 
} 

但還有另一種模式,如果你想受益

static int foo = 0; 

或者,你可以,如果你使用ObjC++使用C++匿名命名空間來自物業的優勢:

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; 

但是你必須提供getter和setter

從Xcode的8發佈說明: 的Objective-C現在支持類屬性,這與雨燕特性互操作。它們被聲明爲:@property(class)NSString * someStringProperty ;.他們從未合成過。 (23891898)