2011-11-04 13 views
16

Iは、ヘッダファイルで宣言された変数を有する:インスタンス変数 '変数' クラスメソッドエラーでアクセス

@interface

int _nPerfectSlides; 

@property (nonatomic, readwrite) int _nPerfectSlides; 

を、私は方法を有すること私はヘッダーで宣言しました:

+ (void) hit; 

方法は、その中に次のコードを持っている:私は、メソッド内の任意の変数にアクセスカントのように、私はエラーを取得するいくつかの理由で、今

+ (void) hit { 
    NSLog(@"hit"); 
    _nPerfectSlides = 0; 
    [_game showHit]; 
} 

を「インスタンス変数 『_nPerfectSlides』クラスメソッドでアクセス」エラーと、それはそうです。私は間違って何をしていますか?

答えて

20

これをインスタンスメソッドにする場合は、+を - に変更します。

+0

はい私は投稿前にこの問題を修正しましたが、別のクラスのメソッドを呼び出そうとするとクラッシュします...どうすればいいですか? –

+5

クラスのインスタンスを作成し、そのインスタンスでインスタンスメソッドを呼び出します。 – Arkku

+6

OOPのコアコンセプトを把握していないようです。あなたはこのようなドキュメントを同化しましたか? http://www.otierney.net/objective-c.html – Cyrille

7

インスタンス変数は、その名前が示すように、インスタンスメソッド(-で宣言されたもの)でしかアクセスできません。クラスメソッド(+で宣言)は、インスタンス変数へのアクセス権がなく、selfオブジェクトへのアクセス権を持っています。

+0

okだから、私はインスタンス変数にアクセスする間、他のクラスからアクセスするクラスメソッドをどのように作成できますか? –

+3

私はあなたのコメントを理解していません。 '+(void)ヒット'を ' - (void)ヒット'に変更するか、クラスの '@interface'の外にグローバルレベルで' _nPerfectSlides'を宣言します。 – Cyrille

17

1.+ (void)hitの場合:selfオブジェクトにのみアクセスできます。

- ステップ1:ヘッダファイルから削除follwingライン

@property (nonatomic, readwrite) int _nPerfectSlides; 

- ステップ2:

  • それ
  • ..グローバルクラスファイルにint _nPerfectSlidesを追加前に宣言することを意味する。@implementation

例:- (void)hitについては.m File

#import "Controller.h" 
int _nPerfectSlides // Add like this before @implementation 

@implementation Controller 

2では:だけ私はこれが古いですけど、それはまだ立ち上がるインスタンスメソッド

3

へのアクセス権を持っています。静的にしてみてください。ここでは、コードを増やすためにコードを少し変更しています。

// Hit.h 

#import <Foundation/Foundation.h> 
@interface Hit : NSObject 
+ (void)hit; 
@end 

// Hit.m 

#import "Hit.h" 
@implementation Hit 
static int val = 0; 
+ (void)hit { 
    val += 1; 
    [self showHit]; 
} 
+ (void)showHit { 
    NSLog(@"hit value: %d", val); 
} 
@end 

//main.m 

#import <Foundation/Foundation.h> 
#import "Hit.h" 

int main(int argc, const char * argv[]) { 
    @autoreleasepool { 
     [Hit hit]; 
     [Hit hit]; 
     [Hit hit]; 
    } 
    return 0; 
} 
関連する問題