web-dev-qa-db-ja.com

客観的なC静的クラス変数

Objective Cは初めてで、Peachpit PressのSteven Holznerによる「Visual Quickstart Guide:Objective-C」という本を読んでいます。

第6章:オブジェクト指向プログラミングには、クラス変数の使用と呼ばれるセクションがあります。

クラスで使用するクラス変数を作成できますが、問題があります。そのクラスのすべてのオブジェクトは同じ変数を共有するため、あるオブジェクトがクラス変数を変更すると、その変数はすべてのオブジェクトで変更されます。 staticキーワードを使用してクラス変数を作成します。クラス変数はしばしば有用です。たとえば、クラス変数を使用して、プログラムで作成された特定のクラスのオブジェクトの数を追跡できます。このタスクでそれを行います。

そして、次のコードを入力するように言います:

#import <stdio.h>
#import <Foundation/NSObject.h>
@interface TheClass: NSObject
static int count; //error: cannot declare variable inside @interface or @protocol
+(int) getCount;
@end
...

このコードにより、Xcode 4でエラーが発生します。

@interfaceまたは@protocol内で変数を宣言できません

この本は間違っていますか、それとも何か間違っていますか?

45
Rakka Rage

実装ファイルで静的変数を宣言します(.mファイル)。これは動作するはずです:

// TheClass.h
@interface TheClass : NSObject
+ (int)count;
@end

// TheClass.m
static int theCount = 0;

@implementation TheClass
+ (int) count { return theCount; }
@end

それ自体はクラス変数ではありません。 Objective-Cにはクラス変数の概念はありません。ただし、この変数を取得するクラスメソッドと組み合わせると、クラス変数と同様に機能します。ただし、実際にはクラスの実装からアクセス可能なCの静的変数にすぎません。

97
mipadi

UnixについてのVisual Quickstart Guideを見たことがありますが、それは大きな時間を費やしました。これは、少なくともサンプルからはそれほど良くないようです。 Objective-Cでクラス変数を作成する正しい方法は次のようになります。

// Counted.h
@interface Counted : NSObject

+ (NSUInteger) numberOfInstances;

@end

// Counted.m
#import "Counted.h"

static NSUInteger instances = 0;

@implementation Counted

- (id) init {
    …
    instances++;
    …
}

- (void) dealloc {
    instances--;
}

+ (NSUInteger) numberOfInstances {
    return instances;
}

@end

これは実際には静的変数であり、真のクラス変数ではありません。しかし、とにかくクラス変数についてあまり心配するべきではありません。それらは通常、何か間違ったことをしている兆候です。 (私は少し単純化しすぎていますが、それほど多くはありません。)

適切なObjective-Cの本を探している場合は、 Appleの本 を読んでください。無料で、良い読み物です。

15
zoul

「クラス変数」が単純な初期化以上のものを必要とする場合は、dispatch_once

@interface Foo ()
+ (Foo *)singleton;
@end

+ (Foo *)singleton {
    static Foo *_singleton;
    static dispatch_once_t oncePredicate;

    dispatch_once(&oncePredicate, ^{
        _singleton = [[Foo alloc] init];
    });

    return _singleton;
}
10
ctd

@implementationが置かれる.mファイルで変数を宣言する必要があります。そう、

#import "TheClass.h"

static int count;

@implementation

...

@end

Objective-Cは実際にはクラス変数をサポートしていないことに注意することが重要です。ただし、ここで行っているように、静的変数を使用してそれらをシミュレートできます。

6
EJV