2

以下のコードを捨てて、変数の寿命を理解しようとしています。新しいインスタンスをインスタンス化するときに _inside と _outside が保持されているのを確認できますが、ブレースはそうではありません。

@interface ViewController (){
    NSString *_innBraces;
}

@end

NSString *_outside;

@implementation ViewController{
    NSString *_inmBraces;
}

NSString *_inside;

-(id)initWithInside:(NSString*)inside outside:(NSString*)outside nBraces:(NSString*)nBraces mBraces:(NSString*)mBraces{
    self = [super init];
    if (self) {
        _inside = inside;
        _outside = outside;
        _innBraces = nBraces;
        _inmBraces = mBraces;
        return self;
    }else{
        return nil;
    }
}
  1. _inside と _outside の宣言の場所に違いはありますか?
  2. 中括弧変数が宣言されている場所との違いはありますか?
  3. 同じように宣言された静的変数と _inside/_outside 変数の違いはありますか?
4

1 に答える 1

5
  1. _inside_outsideどちらもグローバル変数として宣言されています。
  2. 同じファイルですべてを宣言しているように見えるので、 と の間に違いはありません_innBraces_inmBracesどちらもクラスのインスタンス変数です。がヘッダー ファイルにある場合、実装ファイルでのみ表示され、ファイルをインクルードするすべてのファイルで表示される@interfaceため、2 つのスコープの違いがわかります。_inmBraces_innBraces.h
  3. これらはどちらも static と宣言されていません。それらが (staticキーワードの前に) あった場合、それらはそれぞれ、宣言されているファイルに対してストレージと名前空間でローカルになります。

1 と 3 の場合、どちらもそのままの C 宣言であるため、@implementationandのスコープ内にあるかどうか@interfaceは関係ありません。Objective-C には、クラス変数などはありません。

クラス変数の場合、一般的なプロセスは、次の形式のファイル静的変数を作成することです。

static NSString *sMyClassVariable;

実装ファイル内。この変数は静的であるため、実装ファイル以外のファイルでは表示されません。

于 2013-04-02T11:03:56.663 に答える