15

自動変数をサポートしていることは知っていますが、クラス変数はどうですか?

4

4 に答える 4

33

この言語はクラス変数をサポートしていません。static実装のコンパイル単位で、グローバル変数を使用してクラス固有の状態を実装します。

ヘッダー (.h ファイル):

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

実装 (.m ファイル):

static int val = 123;

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

使用法:

if ([MyClass val] > 100) ...
于 2012-06-25T10:29:10.750 に答える
7

ObjC クラス変数は、単純な古い静的変数です。

Foo.m:

static int foo = 0;

または、ObjC++ を使用する場合は、C++ の匿名名前空間を使用できます。

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 = …;

少しやり過ぎに見えるかもしれませんが、これは興味深い解決策です。インスタンス プロパティと「クラス」プロパティの両方に同じ構造体と言語機能を使用します。必要に応じた原子性、必要に応じたアクセサ、デバッグ、ブレークポイント... 継承さえも。

創造的な心は、これをすべて行うための他の方法を見つけることができると思います. :)しかし、これらのオプションでほとんどカバーされています。

于 2012-06-25T10:45:22.147 に答える